pwnable.kr collision


collision

登录系统:

pwnable.kr collision_第1张图片


看代码:

pwnable.kr collision_第2张图片

简单分析一下代码就知道了,要输入20个字符。


这个函数的意思就是把输入的20个字符串每四个字节加起来,最后要等于haskcode,执行system函数。

因此,可以输入这样的字符串’\x00’*16+’\xec\x09\xdd\x21’

                                                  

但是这样输出看一下,中间被截断了。。。是哪里截断的呢?提供一个表看一下吧,09是一个控制字符(水平制表符)。原来是这个字符隔断了

那就’\x00’*12+’\x00\x05\x00\x00’+’\xec\x04\xdd\x21’吧

后来发现不能有0x00,真是醉了&……&,那就’0x10‘*16+0x21dd04dc吧

因为小端存储的原因,要这样写

‘\x01’*16+‘\xdc\x04\xdd\x21’但是发现还是错了!!!!

是自己没有理解!!!

 

那只好单步看一下了。

pwnable.kr collision_第3张图片

这里有几个点:

1 读入字符存到内存中是倒序的,是因为小端存储

2 这里ip[i]表示的是读入字符的ascii码,0x44434241,然后对0x44434241这一个整体,转换成十进制整数是1145258561。因此加到res中的就是每一组字符的ascii。

分析原因:


是这句话把输入的char*p 强制转化问int *p,原来指向一个字节的字符指针,现在指向了4个字节(如下图是32位)

 

那么现在就知道怎么写了

‘\x01’*16 表示的是

\x01\x01\x01\x01 表示为0x1010101

那么用hashcode (0x21DD09EC) -0x1010101 * 4 = 0x1DD905E8

所以最后要输入到内存的值就是:

`python-c "print '\x01' * 16 +'\xE8\x05\xD9\x1D'"`

(python 这样写是直接操作内存数值~~~)

OK!!!

 

 

附:

 

pwnable.kr collision_第4张图片pwnable.kr collision_第5张图片pwnable.kr collision_第6张图片


你可能感兴趣的:(pwn学习)