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'直接寫入到內存.

注意: 這有一個坑 "不是兩個單引號,一定寫成雙引號.

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