20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

20145302張薇發表於2017-03-01

20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

實驗內容

  • 實踐物件:名為20145302的linux可執行檔案。
  • 該程式正常執行流程是:main呼叫foo函式,foo函式會簡單回顯任何使用者輸入的字串。
  • 該程式同時包含另一個程式碼片段,getShell,會返回一個可用Shell。但是正常情況下這個程式碼是不會被執行的。我們實踐的目標就是想辦法執行這個程式碼片段。
  • 實踐兩種方法:
    • 手工修改可執行檔案,改變程式執行流程,直接跳轉到getShell函式。
    • 利用foo函式的Bof漏洞,構造一個攻擊輸入字串,覆蓋返回地址,觸發getShell函式。

實驗原理

  • 緩衝區溢位:計算機程式一般都會使用到一些記憶體,這些記憶體或是程式內部使用,或是存放使用者的輸入資料,這樣的記憶體一般稱作緩衝區。溢位是指盛放的東西超出容器容量而溢位來了,在計算機程式中,就是資料使用到了被分配記憶體空間之外的記憶體空間。而緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測(理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元),向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。

實踐1、手工修改可執行檔案

  • 先執行一下此檔案,應該實現的是foo函式的功能:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 將此檔案進行反彙編:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

- 第一列表示記憶體中的地址,第二列是機器指令的十六進位制程式碼,第三列是反彙編後的彙編指令。
- 在main函式中我們發現有一條call指令呼叫了地址為8048491的foo函式
- 為了使函式不執行foo函式,二是執行getshell函式,我們想要把main函式的call指令後的地址改為getshell函式的地址。
- call指令的機器程式碼為“e8 d7 ffffff”,為了呼叫為getshell的地址,我們需要將“e8 d7 ffffff”改為“getshell-80484ba”對應的補碼,即“e8 c3 ffffff”。
  • 開始手動修改可執行檔案
  • 利用vi進入檔案:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 此時檔案介面顯示的是ASCⅡ碼形式,我們輸入命令:%!xxd,將顯示模式切換為16進位制模式
  • 由於資料太多,我們使用查詢功能,輸入“/e8 d7”,查詢我們所需修改的內容:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 利用vi的修改功能,點選i鍵進入插入模式,並將d7修改為c3:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 使用命令:%!xxd -r將16進位制轉換為原格式,隨後再用:wq命令存檔退出vi。(這一步很重要,否則無法成功執行)
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 驗證執行是否修改成功:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 再次使用反彙編指令觀察機器程式碼的改變:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

實踐2、通過構造輸入引數,造成BOF攻擊,改變程式執行流

  • 反彙編檢視檔案彙編程式碼
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 我們發現foo函式只為該檔案留了38位元組的緩衝區,超出部分會造成溢位,我們的目標是覆蓋返回地址
  • 進入gdb模式用r來執行,再使用info r來檢視暫存器中的值。在此使用測試數字:1111111122222222333333334444444455555555.(我們完全可以使用其他數字來進行測試,只要自己易於區分即可)
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 我們觀察到eip的值為"0x35353535 0x35353535",而十六進位制的35換算成ASCⅡ碼是5,由此得知溢位部分是在5這一部分發生的,為了進一步詳細確認地址發生覆蓋的位置,我們將測試數字更變為:1111111122222222333333334444444412345678
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 觀察得知:eip的值更變為“0x34333231 0x34333231”,換算成ASCⅡ碼即為1234。意味著字串1111111122222222333333334444444412345678中1234那四個位置上的數最終會覆蓋到堆疊上的返回地址,進而CPU會嘗試執行這個位置的程式碼
  • 由此,我們將這4個位置上的數替換為getShell的記憶體地址,就可以讓檔案執行getShell
  • 確認位元組序:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

  • 輸入我們構造的字串來進行攻擊,驗證攻擊成功:
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐


Perl是一門解釋型語言,不需要預編譯,可以在命令列上直接使用。
使用輸出重定向“>”將perl生成的字串儲存到檔案input中。

實踐問題

  • 為何進入vi後,在16進位制模式下修改後直接儲存退出會導致檔案無法執行?
    20145302張薇 《網路對抗技術》逆向及BOF基礎實踐

相關文章