20154305 齊帥 PC平臺逆向破解
Exp1 PC平臺逆向破解
一、實踐目標
本次實踐的對象是一個名為pwn1的linux可執行文件。
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。
二、實驗要求
報告內容
- 掌握NOP, JNE, JE, JMP, CMP匯編指令的機器碼(0.5分)
- 掌握反匯編與十六進制編程器 (0.5分)
- 能正確修改機器指令改變程序執行流程(0.5分)
- 能正確構造payload進行bof攻擊(0.5分)
報告整體觀感
報告格式範圍,版面整潔 加0.5。
報告排版混亂,加0分。
文字表述
報告文字內容非常全面,表述清晰準確 加1分。
報告邏輯清楚,比較簡要地介紹了自己的操作目標與過程 加0.5分。
報告邏輯混亂表述不清或文字有明顯抄襲可能 加0分。
三、實驗方法
- 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
四、實驗步驟
(一)反匯編查看pwn1的內容並計算修改地址的值
1. 輸入反匯編指令 objdump -d 20154305|more查看可執行文件內容,其中20154305為pwn1的一個副本
2. 向下翻頁找到getshell函數、foo函數和main函數
由圖中可見“ 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。
(二)修改可執行文件
1. 用vim編輯器打開20154305可執行文件,輸入 vim 20154305
2. 在 vim 編輯器中按 Esc 鍵,輸入" :%!xxd "將原格式轉換成十六進制顯示,結果如下圖:
3. 查找要修改的內容,輸入“ /e8 d7 "。
此處可通過記錄改行機器語言前邊的編號000004b0標識位置。
4. 修改d7為c3
具體操作是將光標移動到要修改的位置,然後按下鍵盤上的 r 鍵,然後按下修改的目標值。
5. 轉換十六進制為原格式,輸入 “ :%!xxd -r ” 。
6. 保存、退出 vim 編輯器
輸入 “ :wq ”
(三)反匯編檢查修改後的結果
修改指令成功,本次試驗成功完成。
(五)實驗總結
首先,由於條件有限,我實驗的PC未能安裝32位運行器,不能運行該可執行文件,但是已將修改後的文件在其他同學電腦上運行過了,可以執行且達到目的。
其次,本次實驗內容雖然以前從未接觸過,但是同樣也給我帶來了興趣,使我能夠深入地去學習研究,並且可參考的報告、案例比較多,理解相對比較深刻,但是對於該實驗的其他攻擊方法暫時沒有頭緒,會在以後的課上繼續深入研究。
20154305 齊帥 PC平臺逆向破解