接前篇,记录下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'直接写入到内存.
注意: 这有一个坑 "不是两个单引号,一定写成双引号.