逆向及BOF基礎實踐

逆向及BOF基礎實踐 html

20145316 許心遠 shell

  1、緩衝區溢出基礎知識 編程

  緩衝區溢出是一種很是廣泛、很是危險的漏洞,在各類操做系統、應用軟件中普遍存在。利用緩衝區溢出攻擊,能夠致使程序運行失敗、系統宕機、從新啓動等後果。更爲嚴重的是,能夠利用它執行非受權指令,甚至能夠取得系統特權,進而進行各類非法操做。第一個緩衝區溢出攻擊--Morris蠕蟲,發生在1988年,由羅伯特,莫里斯(R ob。rtMorris)製造,它曾形成全世界6000多臺網絡服務器癱瘓。 vim

  計算機程序通常都會使用到一些內存,這些內存或是程序內部使用,或是存放用戶的輸入數據,這樣的內存通常稱做緩衝區。溢出是指盛放的東西超出容器容量而溢出來了,在計算機程序中,就是數據使用到了被分配內存空間以外的內存空間。而緩衝區溢出,簡單的說就是計算機對接收的輸入數據沒有進行有效的檢測(理想的狀況是程序檢查數據長度並不容許輸入超過緩衝區長度的字符),向緩衝區內填充數據時超過了緩衝區自己的容量,而致使數據溢出到被分配空間以外的內存空間,使得溢出的數據覆蓋了其餘內存空間的數據。 服務器

  緩衝區溢出中,最爲危險的是堆棧溢出,由於入侵者能夠利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰致使拒絕服務,另一種就是跳轉而且執行一段惡意代碼,好比獲得shell,而後隨心所欲。 網絡

  (本次實驗就是跳轉到shell)。 編輯器

  緩衝區溢出攻擊的目的在於擾亂具備某些特權運行的程序的功能,這樣可使得攻擊者取得程序的控制權,若是該程序具備足夠的權限,那麼整個主機就被控制了。通常而言,攻擊者攻擊root程序,而後執行相似"exec(sh)"的執行代碼來得到root權限的shell。爲了達到這個目的,攻擊者必須達到以下的兩個目標: 函數

  1. 在程序的地址空間裏安排適當的代碼。 工具

  2. 經過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。 編碼

  (本次實驗是基於目標二的實現來完成的。)

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

  (一)反彙編,瞭解程序的基本功能

                      1.先創建一個以本身學號姓名命名的我的文件夾,將pwn1放入

     

 

2.pwn1是可執行文件,直接運行便可,知道功能是回顯輸入

但輸入過長時出現"segmentation fault"提示,即非法佔用內存(緩衝區溢出)

3.用指令objdump反彙編pwn1,管道後的more表示按頁顯示,按空格鍵便可翻頁

4.簡單分析下反編譯的代碼

Main函數:注意main函數的第四行call 8048491<foo>,是跳轉到foo函數的意思,這一行指令是本次實踐的關鍵

 

Foo函數:原本應該跳轉到的函數,功能是回顯輸出,但存在緩衝區溢出漏洞。系統只預留了?(不會看)字節的緩衝區,超出部分會形成溢出,咱們的目標是覆蓋返回地址

Getshell函數:本實驗咱們目標要觸發的就是這個"搗亂"的函數——惡意代碼,它能夠實現shell外殼的功能

  (二)確認輸入字符串哪幾個字符會覆蓋到返回地址

1.gdb調試

2.嘗試輸入1111111122222222333333334444444455555555,觀察各個寄存器數值

 

 

3.注意eip寄存器中的值爲0x35353535,即5555的ASCII碼。你們知道eip寄存器的功能就是保存程序下一步所要執行指令的地址,此處咱們能夠看出原本應返回到foo函數的返回地址已被"5555"覆蓋

4.將原本"55555555"的地方替換爲"12345678"更方便看出是字符串中哪幾個字符實現了覆蓋,根據eip中的ASCII碼0x34333231發現是"1234"。

  (三)確認用什麼值來覆蓋返回地址

1.如今咱們經過反彙編已知返回地址(getshell地址)應爲0804847d,但並不肯定要這臺機器採用的字節序是大端仍是小端,因此沒法肯定輸入數據應爲\x08\x04\x84\x7d仍是\x7d\x84\x04\x08。

2.在輸入字符串的地方0x804849d處設置斷點,查其eip 0x804849d 0x804849d

3.再對比以前 eip 0x34333231 0x34333231 (4321對應ASCII碼爲34333231)因此得出正確應輸入 11111111222222223333333344444444\x7d\x84\x04\x08

 



 

 

 

 

 

 

    

  (四)構造輸入字符串

1.沒法經過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值(foo函數的輸入是字符串形式,不是數值)

2.因此要先生成包括這樣字符串的一個文件。\x0a表示回車,若是沒有的話,在程序運行時就須要手工按一下回車鍵。

 

 

3.使用輸出重定向">"將perl生成的字符串存儲到文件input中;而後用16進制查看指令xxd來查看字符串是否如願重定向到input文件中

  (五)完成

將input的輸入,經過管道符"|",做爲pwn1的輸入。由於個人pwn1文件在學號姓名文件夾和home文件夾裏各放了一份,因此兩個文件夾中各執行shell的ls指令結果不一樣。

 

 

3、實踐:直接修改程序機器指令,改變程序執行流程

  (一)製做副本,觀察反彙編代碼。

1.製做一個pw1執行文件的副本,pw2,對其進行反彙編,觀察<main>、<foo>、<getshell>的核心代碼,找出可供改變程序執行流程的"空子"

 2.先看main函數反彙編的第4行,"call 8048491 "是彙編指令,是說這條指令將調用位於地址8048491處的foo函數;其對應機器指令爲"e8 d7ffffff",e8即跳轉之意。原本正常流程,此時此刻EIP的值應該是下條指令的地址,即80484ba,但一解釋e8這條指令呢,CPU就會轉而執行 "EIP + d7ffffff"這個位置的指令。"d7ffffff"是補碼,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491這個值(foo函數調用入口),

3.main函數調用foo,對應機器指令爲" e8 d7ffffff",那咱們想讓它調用getShell,只要修改"d7ffffff"爲,"getShell-80484ba"對應的補碼就行。用Windows計算器,直接 47d-4ba就能獲得補碼,是c3ffffff。

4.下面咱們就修改可執行文件,將其中的call指令的目標地址由d7ffffff變爲c3ffffff

  (二)直接在vim編輯器中修改(須要知道各類編輯操做口令)

      

改正以後的彙編碼,e8d7ffffff變爲e8c3ffffff

 

  (三)在圖形化的16進制編程器中完成修改

  1.安裝wxhexeditor

  root@KaliYL:~# apt-get install wxhexeditor

  root@KaliYL:~# wxHexEditor

    

      2.在菜單欄的file中選擇open打開pwn2文件

      

    3.利用查找工具等完成e8d7到e8c3的替換

    

 

  (四)完成

下面咱們再反彙編一下,看看call指令是否正確調用getshell,結果是正確的,完成。

 

 4、實踐:shellcode注入

下一篇日誌:shellcode入門 http://www.cnblogs.com/xxy745214935/p/6477120.html

相關文章
相關標籤/搜索