逆向與Bof基礎

一逆向及Bof基礎實踐說明html

 實踐目標linux

本次實踐的對象是一個名爲pwn1的linux可執行文件。shell

該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。windows

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

實驗過程:bash

第一部分實驗:網絡

1、先下載並解壓pwn1app

 

:多是因爲我上課時沒有注意到必須先解壓後再來進行反彙編,致使實驗與指導書上總是不一樣,心累。。。。,後經同窗提醒,才走上正路dom

2、反彙編函數

 

 

(注:咱們找的是main下的命令,故要按enter直至到達main處)

  

"call 8048491 <foo>"是彙編指令

是說這條指令將調用位於地址8048491處的foo函數;

其對應機器指令爲e8 d7ffffff」,e8即跳轉之意。

原本正常流程,此時此刻EIP的值應該是下條指令的地址,即80484ba,但如一解釋e8這條指令呢,CPU就會轉而執行 「EIP + d7ffffff」這個位置的指令。「d7ffffff」是補碼,表示-4141=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491這個值,

 

main函數調用foo,對應機器指令爲「 e8 d7ffffff」,

那咱們想讓它調用getShell,只要修改「d7ffffff」爲,"getShell-80484ba"對應的補碼就行。

Windows計算器,直接 47d-4ba就能獲得補碼,是c3ffffff

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

此上引用與指導書。

三、複製學號文件:

 

注(cpls等都爲Linux指令,我本身參考的是《鳥哥的私房菜》第三版,可使用man 來查詢用法,還有強大的Tab補全鍵)

四、修改可執行文件

如下操做是在vi

ESC鍵(目的是爲了進入到編輯模式)

輸入以下,將顯示模式切換爲16進制模式                 :%!xxd

查找要修改的內容                                       /e8d7

找到後先後的內容和反彙編的對比下,確認是地方是正確的修改d7c3

轉換16進製爲原格式                                     :%!xxd -r

存盤退出vi                                              :wq

 

很奇怪(爲何過濾了3行)

 

修改:按ESC後,箭頭鍵移動光標到指定位置,後R+修改的字符進行修改

 

五、再反彙編看一下,call指令是否正確調用getShell

 

6、運行下改後的代碼,會獲得shell提示符#

實驗完成

(注:在這步操做中,不知是否是人品的問題,

輸入 .\20151120

結果出現了bash::沒法找到那個文件或目錄,我很崩,結果我問了問同窗,只有一個同窗出現了和我同樣的問題,而後咱們更新了一個包以後,恢復了正常,然而並不知因此然)

 

(另,在更新包時,出現了E:沒法得到鎖的問題

自行百度: 輸入 sudo rm /var/cache/apt/archives/lock

 sudo rm /var/lib/dpkg/lock後解決了問題)

 

 

3、實驗體會

    這是我第二次接觸網絡安全的課程,第一次是信息安全概論,然而在此次,感受知識有莫大的提高,從未涉及過多網絡攻防知識的我深感基礎太差,所以,須要大量的自行充電,在此次實驗中,瞭解了kali的一些操做命令,還有彙編語言的知識,甚至還有進制的問題,總之這門課博大精深,但願接下來能有更大收穫。

 

第二部分實驗:

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

知識要求:堆棧結構,返回地址 學習目標:理解攻擊緩衝區的結果,掌握返回地址的獲取 進階:掌握ELF文件格式,掌握動態技術

 1反彙編,瞭解程序的基本功能

注意這個函數getShell,咱們的目標是觸發這個函數  ==

 

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

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

Gdb 運行程序

若是輸入字符串1111111122222222333333334444444412345678,那 1234 那四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲 getShell 的內存地址,輸給2015112020151120就會運行getShell

 

3確認用什麼值來覆蓋返回地址

getShell的內存地址,經過反彙編時能夠看到,即0804847d。

4構造輸入字符串

由爲咱們無法經過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值,因此先生成包括這樣字符串的一個文件。\x0a表示回車,若是沒有的話,在程序運行時就須要手工按一下回車鍵

可使用16進制查看指令xxd查看input文件的內容是否如預期。

第二部分結束。

 

 

第三部分:

 

 

注入Shellcode並執行

 

 

準備一段Shellcode

shellcode就是一段機器指令(code

一般這段機器指令的目的是爲獲取一個交互式的shell(像linuxshell或相似windows下的cmd.exe),

因此這段機器指令被稱爲shellcode

在實際的應用中,凡是用來注入的機器指令段都通稱爲shellcode,像添加一個用戶、運行一條指令。

 

最基本的shellcode的編寫可參考許同窗的文章Shellcode入門,寫得很是之清楚詳實。如下實踐即便用該文章中生成的shellcode。以下:

 

\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\

 

構造要注入的payload

Linux下有兩種基本構造攻擊buf的方法:

retaddr+nop+shellcode

nop+shellcode+retaddr

由於retaddr在緩衝區的位置是固定的,shellcode要不在它前面,要不在它後面。

簡單說緩衝區小就把shellcode放後邊,緩衝區大就把shellcode放前邊

--

 

咱們這個buf夠放這個shellcode

結構爲:nops+shellcode+retaddr

nop一爲是了填充,二是做爲「着陸區/滑行區」。

咱們猜的返回地址只要落在任何一個nop上,天然會滑到咱們的shellcode

 

而後百度了一下,install一下就ok

修改些設置。這部分的解釋請看第5小節Bof攻擊防護技術.

 

 execstack -s 20151120    //設置堆棧可執行

 execstack -q 20151120    //查詢文件的堆棧是否可執行

X pwn1

 more /proc/sys/kernel/randomize_va_space

2

 echo "0" > /proc/sys/kernel/randomize_va_space //關閉地址隨機化

 more /proc/sys/kernel/randomize_va_space 驗證一下

0

而後構造一個shellcode進行注入

注意:(cat input_shellcode;cat) | ./20151120 完了不能回車,就保持不動,另打開一個終端查找進程號,否則就出錯涼涼。

Ps -ef | grep 20151120爲查找進程號

Gdb調試程序:

結果以下:不知道對否,出現了非法指令,想吐。。。。

另:可參考https://wenku.baidu.com/view/503d7977f242336c1eb95e1c.html?from=search

我對堆棧等寄存器不熟,因此這個網址能夠彌補知識

相關文章
相關標籤/搜索