有了第一个就会有之后的很多很多个吧


ssh col@pwnable.kr -p2222 (pw:guest)之后,发现跟上一个题的套路差不太多

看到了三个文件col,col.c和flag,flag没法直接打开,需要去看程序


cat col.c查看源码:发现有一个套路差不多:argc<2的判断在第一题已经会了
另外,有了一个strlen的限制,长度必须是20位
想要拿到flag,就必须懂check_password这个函数

于是就拿着运行跑一次

./col ABCDEFGHIJKLMNOPQRST
说好的是20个不然退出了
按ASCII码的顺序写入是为了便于判断
看到了wrong passcode,说明分析得正确


于是,把源码复制出来
在check_password()函数中,把所有的中间变量值输出
同样的输入可以看到:
1145258561……

看到这个很明显是10进制数,转成16进制会有惊人发现:hex(1145258561)=0x44434241
就是ASCII码哦!

那么可以看到:现在的问题就是把20个字符分成五组每个四个字符
使得A1B1C1D1+A2B2C2D2+A3B3C3D3+A4B4C4D4=hashcode=0x21DD09EC

所以这个题肯定是多解的,从算法的角度来说找一组就可以
先算末尾,0xEC=236要分成5份就不可显示了,所以要用0x1EC=492
492=5*98+2=3*98+2*99,所以呢,知道了写3个b和2个c

注意,0x1EC借走1位,所以下一组用这种方法计算应该得到的是0x08,同理不够分,再往上借

到了0x21呢,可以无数次借不用还,因为最高位自动溢出了不用管

注意!计算完了之后,需要看填写的顺序。
我们在输入ABCD的时候,显示的是0x44434241
有个分组和逆序的关系

提供一组可以看到flag的解:bhambhambhamchamchWl

想得到flag的话,自己去算一组其他的解吧