pwnable.kr collision


collision

登录系统:



看代码:


简单分析一下代码就知道了,要输入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’但是发现还是错了!!!!

是自己没有理解!!!

 

那只好单步看一下了。


这里有几个点:

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!!!

 

 

附:

 



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值