Exp1 PC平臺逆向破解(5)M
Exp1 PC平臺逆向破解(5)M
實踐內容
- 實踐對象是一個可執行文件pwn1
- 本程序的正常執行順序應該是main函數調用foo函數,foo函數輸出用戶輸入的字符串。
本程序還包含了另一個代碼片段getshell,會返回一個可用的shell值,在正常的執行狀況中該段代碼不會被執行,而我們此次實踐的內容就是對可執行文件進行攻擊,從而讓程序執行到此段代碼。
實踐要求
2.1掌握NOP, JNE, JE, JMP, CMP匯編指令的機器碼(0.5分) 2.2掌握反匯編與十六進制編程器 (0.5分) 2.3能正確修改機器指令改變程序執行流程(0.5分) 2.4能正確構造payload進行bof攻擊(0.5分)
實踐基礎知識:
(1)NOP指令即“空指令”(機器碼:90)。執行到NOP指令時,CPU什麽也不做,僅僅當做一個指令執行過去並繼續執行NOP後面的一條指令。所以NOP指令自然也會占用執行一個指令的CPU時間片。
(2)JNE是一個條件轉移指令(機器碼:75)。當ZF=0,轉至標號處執行。
(3)JE是一個條件轉移指令(機器碼:74)。如果相等則跳轉。
(4)JMP是無條件轉移指令。段內直接短轉Jmp short(機器碼:EB)段內直接近轉移Jmp near(機器碼:E9)段內間接轉移Jmp word(機器碼:FF)段間直接(遠)轉移Jmp far(機器碼:EA)
(5)CMP為比較指令,功能相當於減法指令,只是對操作數之間運算比較,不保存結果(機器碼:39)。cmp指令執行後,將對標誌寄存器產生影響。其他相關指令通過識別這些被影響的標誌寄存器位來得知比較結果。
實踐過程
本次實踐有三種實現方式
- 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
- 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
註入一個自己制作的shellcode並運行這段shellcode。
手工修改可執行文件
再動手之前應該知道反匯編指令是
objdump -d pwn1(文件名)|more
動手之前應該準備好32位的執行環境
64位Kali無法順利執行pwn1問題的解決方案
開始實踐
- 對pwn1進行備份並將副本命名為自己學號"20155329"並用副本進行實踐。 使用cp 命令進行復制,例如cp pwn1 20155329
- 對可執行文件進行反匯編
objdump -d 20155329 | more
由反匯編結果可以看出
圖一
- e8對應call命令
e8後的綠色部分為抵用的foo函數的偏移地址。
圖二
- main地址是080484af、
- foo地址是08048491、
getshell的地址是0804847d。
綜上所述
- foo函數的地址為08048291,getshellh函數的地址為0804847d,用16進制的減法我們可以精確的算出getshell比foo低了14,也就在原來的基礎上減去14即可。而在linux環境下,采用小端存儲的方式,也就是說d7為低位,就是說將到d7減去14即可,也就是變成c3。,我們使用vim編輯器對地址進行修改。
- 使用vim打開可執行文件20155329
- 此時文本為亂碼,用“%!xxd”指令將文本轉換成16進制文件來進行操作。
**修改偏移地址後,使用“%!xxd -r”將16進制文件轉換成原文件保存退出。
運行可執行文件20155329
實驗中遇見的問題
共享文件夾無法正常使用
重新安裝 VMware tools
安裝32位的運行庫時出現問題
問題:無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用)
E: 無法鎖定管理目錄(/var/lib/dpkg/),是否有其他進程正占用它?”- 解決辦法:
- sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
Exp1 PC平臺逆向破解(5)M