pwn之collision

接前篇,记录下collision的搞法.                  

 

1.点击collision有如下显示,还是ssh登录,今天换一种登陆方式.用windows下的winscp将文件拷贝到本地.需要的在这安装

https://winscp.net/eng/docs/lang:chs

 

2.用winscp创建新的链接:连接后打开col.c文件,至于为什么要看轻翻看前一篇pwnable_Toddler's Bottle之fd

3.打开C文件:

4.分析代码可知,该代码要我们输入一个20bytes的字符串,然后这个check_password函数会将我们输入的20字节的数据每四个看成一个int数据然后分别相加,得到总和与0x21DD09EC比较,若相等则我们就算死破解了.说白了,我们输入的字符,将字符的ascii码每四个一组,然后相加并且=0x21DD09EC.

5.我们把代码调试一下,看看我们输入的参数是怎么存储的:

调试之前设置好命令行参数12341234123412341234:具体方法参考:https://blog.csdn.net/youb11/article/details/49824429

F5,调试,调出内存窗口.

仔细观察调试窗口,内存1是我们输入的命令行参数,内存2是字符1234(实际是0x34333231)5次累加的结果

我们回头看hashcode = 0x21DD09EC 在内存中的值: 注意是大尾,对应数据的高字节存放在低地址

 

综上所述我们要将20个字节的字符按内存中如下所示相加得到 0x21DD09EC

 

我们首先想到的是0x21DD09EC  / 5,取平均值然后写入内存中.然而并不能整除.我们将0x21DD09EC - 4然后可以除尽.最后一个比平均值大4就好了,即0x6C5CEC8,0x6C5CEC8,0x6C5CEC8,0x6C5CEC8,6C5CECC.我们实际要将这些值直接写到内存里,也即这些值是已经对应好的ascii值.那么问题来了,如何将这些值直接写到内存里呢?

"print '\xCC\xCE\xC5\x06'+'\xC8\xCE\xC5\x06'*4"

输入指令: ./col $(python -c "print '\xCC\xCE\xC5\x06'+'\xC8\xCE\xC5\x06'*4")

python -c是指用python解释器执行print '\xCC\xCE\xC5\x06'+'\xC8\xCE\xC5\x06'*4

$()指令是括号内的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个$(),整个语句的意思是将参数'\xCC\xCE\xC5\x06\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06'直接写入到内存.

注意: 这有一个坑 "不是两个单引号,一定写成双引号.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值