20145332 《網路攻防》逆向與Bof實驗
實踐目標
本次實踐的物件是一個名為pwn1的linux可執行檔案。
該程式正常執行流程是:main呼叫foo函式,foo函式會簡單回顯任何使用者輸入的字串。
該程式同時包含另一個程式碼片段,getShell,會返回一個可用Shell。正常情況下這個程式碼是不會被執行的。這次實驗的目標就是想辦法執行這個程式碼片段。
我們將學習兩種方法:
①利用foo函式的Bof漏洞,構造一個攻擊輸入字串,覆蓋返回地址,觸發getShell函式。
②手工修改可執行檔案,改變程式執行流程,直接跳轉到getShell函式。
基礎知識
該實踐需要熟悉Linux基本操作,能看懂常用指令,如管道(|),輸入、輸出重定向(>)等。理解Bof的原理。能看得懂彙編、機器指令、EIP、指令地址。會使用gdb,vi。
直接修改程式機器指令,改變程式執行流程
首先對pwn1進行反彙編,指令為objdump -d pwn1 | more
先看第12行,"call 8048491 "是彙編指令,是說這條指令將呼叫位於地址8048491處的foo函式;其對應機器指令為“e8 d7ffffff”,e8即跳轉之意。本來正常流程,此時此刻EIP的值應該是下條指令的地址,即80484ba,但一解釋e8這條指令呢,CPU就會轉而執行 “EIP + d7ffffff”這個位置的指令。“d7ffffff”是補碼,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491這個值,main函式呼叫foo,對應機器指令為“ e8 d7ffffff”,那我們想讓它呼叫getShell,只要修改“d7ffffff”為,"getShell-80484ba"對應的補碼就行。用Windows計算器,直接 47d-4ba就能得到補碼,是c3ffffff。下面就修改可執行檔案,將其中的call指令的目標地址由d7ffffff變為c3ffffff。
在修改前先將pwn1複製一份,命名為pwn20145332,指令為:cp pwn1 pwn20145332。使用vi編譯,在輸入完vi後出現的是亂碼,需要將其轉化為十六進位制,使用的指令為%!xxd,然後使用指令/e8d7,找到需要修改的地方,將d7修改為c3,。(這部分沒有截圖,只擷取了修改後的結果)
修改後使用指令%!xxd -r將其轉化為原來的形式,然後儲存退出。執行pwn20145332,指令為./pwn20145332,執行下改後的程式碼,會得到shell提示符#,結果如下:
通過構造輸入引數,造成BOF攻擊,改變程式執行流
在實驗前,將pwn複製一份,命名為20145332
實驗指令為:more input,xxd input,(cat input; cat) | ./20145332,結果如下: