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'直接写入到内存.

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章