1. 程式人生 > >Exp1 PC平臺逆向破解(5)M

Exp1 PC平臺逆向破解(5)M

占用 寄存器 32位 覆蓋 技術分享 too open lin 執行

Exp1 PC平臺逆向破解(5)M

實踐內容

  1. 實踐對象是一個可執行文件pwn1
  2. 本程序的正常執行順序應該是main函數調用foo函數,foo函數輸出用戶輸入的字符串。
  3. 本程序還包含了另一個代碼片段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指令執行後,將對標誌寄存器產生影響。其他相關指令通過識別這些被影響的標誌寄存器位來得知比較結果。

實踐過程

本次實踐有三種實現方式

  1. 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
  2. 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
  3. 註入一個自己制作的shellcode並運行這段shellcode。

    手工修改可執行文件

    再動手之前應該知道反匯編指令是

objdump -d pwn1(文件名)|more 

動手之前應該準備好32位的執行環境

64位Kali無法順利執行pwn1問題的解決方案

開始實踐

  • 對pwn1進行備份並將副本命名為自己學號"20155329"並用副本進行實踐。 使用cp 命令進行復制,例如cp pwn1 20155329
  • 對可執行文件進行反匯編
objdump -d 20155329 | more

技術分享圖片
技術分享圖片

由反匯編結果可以看出

圖一
  1. e8對應call命令
  2. e8後的綠色部分為抵用的foo函數的偏移地址。

    圖二
  3. main地址是080484af、
  4. foo地址是08048491、
  5. 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