20145238-荊玉茗 《網絡對抗》-逆向及Bof基礎實踐

20145238荊玉茗《網絡對抗》-逆向及Bof基礎實踐

1 逆向及Bof基礎實踐說明

1.1 實踐目標

本次實踐的對象是一個名爲pwn1的linux可執行文件。
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。linux

1.2 基礎知識

該實踐須要同窗們熟悉Linux基本操做,能看懂經常使用指令,如管道(|),輸入、輸出重定向(>)等。
理解Bof的原理。
能看得懂彙編、機器指令、EIP、指令地址。
會使用gdb,vi。shell

2 直接修改程序機器指令,改變程序執行流程

(1)先把原文件複製本身的文件夾裏,進行反彙編
網絡

其中call 8048491是彙編指令,這條指令將調用位於地址8048491處的foo函數;其對應機器指令爲e8 d7ffffff,EIP的值應該是下條指令的地址,即80484ba。
main函數調用foo,對應機器指令爲「 e8 d7ffffff」,調用getShell,只要修改「d7ffffff」爲,"getShell-80484ba"對應的補碼就行,即c3ffffff。函數

(2)在vi中切換爲16進制模式:%!xxd,查找要修改的內容/e8d7,找到後先後的內容和反彙編的對比下,確認是地方是正確的,修改d7爲c3,轉換16進製爲原格式:%!xxd -r,存盤退出vi。
命令行

(3)再反彙編,運行下改後的代碼,會獲得shell提示符#
3d

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

(1)複製pwn1文件爲5238pwn1文件,使用GDB調試
調試

(2)查看寄存器的值
code

(3)再次調試查看是哪一個字符被覆蓋到了eip中:
對象

若是輸入字符串1111111122222222333333334444444412345678,那 1234 那四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲 getShell 的內存地址,輸給pwn1,pwn1就會運行getShell。
(4)低字節放在高位的大端法,即輸入11111111222222223333333344444444\x7d\x84\x04\x08
由爲咱們無法經過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值,因此先生成包括這樣字符串的一個文件。\x0a表示回車,若是沒有的話,在程序運行時就須要手工按一下回車鍵。
blog

關於Perl:
Perl是一門解釋型語言,不須要預編譯,能夠在命令行上直接使用。
使用輸出重定向「>」將perl生成的字符串存儲到文件input中。

(5)用16進制查看指令xxd查看input文件的內容是否如預期,而後將input的輸入,經過管道符「|」,做爲pwn1的輸入。

相關文章
相關標籤/搜索