本次實踐的對象是一個名爲pwn1的linux可執行文件。 顯任何用戶輸入的字符串。linux
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。shell
經過修改機器指令是先運行shell代碼片斷:緩存
將可執行文件zwj反彙編:objdump -d zwj | more函數
能夠看到main函數中call 8048491 對foo函數進行了調用,對應的機器指令e8 d7 ff ff ff ,,e8即跳轉之意,使eip(指向下一條指令)爲eip + d7ffffff,便會跳過當前指令的下一條指令,執行eip+d7ffffff指向指令。3d
想調用getShell,只要修改「d7ffffff」爲,"getShell-80484ba"對應的補碼c3ffffff。
調試
反彙編:
對象
用gdb調試來嘗試輸入肯定哪幾個字符會覆蓋掉返回地址:
blog
嘗試輸入1,2,3,4,5各十個,結果顯示 代碼段錯誤,查看eip的值,肯定返回地址的位置在十個4之中。ip
將4以前的數字不變,十個4變爲123456789a,構造新的輸入。查看eip寄存器的值,肯定返回地址的位置。字符串
構造合適的輸入。因爲咱們無法經過鍵盤輸入\x7d\x84\x04\x08,因此先生成包括這樣字符串文件。而後將input經過管道符「|」,做爲zwj的入形成緩存區溢出,恰好將shell的地址覆蓋到了返回地址上,運行shell。