2017-2018-2 20155315《網絡對抗技術》Exp1:PC平臺逆向破解
阿新 • • 發佈:2018-03-09
損壞 href 補碼 定位 log class ali 相差 運行程序
實驗目的
- 本次實踐的對象是一個名為pwn1的linux可執行文件。
- 該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
- 該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然後學習如何註入運行任何Shellcode。
實驗內容
- 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
- 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
- 註入一個自己制作的shellcode並運行這段shellcode。
實驗要求
- 熟悉Linux基本操作
- 理解Bof的原理
- 會使用gdb,vi
實驗步驟
(一)直接修改程序機器指令,改變程序執行流程
- 知識要求:Call指令,EIP寄存器,指令跳轉的偏移計算,補碼,反匯編指令objdump,十六進制編輯工具
- 學習目標:理解可執行文件與機器指令
- 進階:掌握ELF文件格式,掌握動態技術
思路
- 一個程序的可執行文件可通過
objdump
命令對其進行反匯編,通過對匯編語言的學習可以看出程序讀取數據的過程。
- 從反匯編的文件來看,main函數中調用foo函數,使用call指令。通過分析發現foo函數與getShell函數的首地址之間
存在偏移,兩者之間相差了14。系統調用foo函數對應機器指令為e8 d7ffffff
e8 d7ffffff
進行修改。 - 已經知道電腦是小端模式,即數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中。因此,如果要修改,就要將"d7"改為"c3"。
- 具體操作過程:
- 將pwn1進行備份,修改備份文件
- 用vi打開備份文件,用
:%!xxd
將顯示模式切換為16進制模式 - 用
/d7
查找要修改的內容,定位後將d7改為c3 - 用
:%!xxd -r
將轉換16進制為原格式,保存退出。
- 再次反匯編之後,確定已經將程序修改為調用getShell函數,接下來就是運行程序了。
- 運行時發現無法找到目錄或文件,按照老師提供的教程進行操作就可以了。
運行截圖
思考
運行成功之後就完成了實驗的第一個部分,按照老師的指導一步步操作還算順利。遇到的問題是,第一次在16進制模式修改完數據後出現操作失誤,先保存後轉換,在運行的時候導致文件損壞不可用。這是因為一開始保存的時候就改變了文件的格式,使得它不再是一個可執行文件的格式。查找資料後沒有找到能將其再次轉換的方法,只好重新進行實驗。
參考資料
- kali國內更新源
- objdump的用法
- 64位Kali無法順利執行pwn1問題的解決方案
2017-2018-2 20155315《網絡對抗技術》Exp1:PC平臺逆向破解