目錄html
目標一:手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。linux
目標二:利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。git
目標三:注入一個本身製做的shellcode並運行這段shellcode。shell
指令 | 做用 |
---|---|
objdump -d | 反彙編指令 |
xxd | 將一個文件以十六進制的形式顯示出來 |
cat | 從第一個字節開始正向查看文件的內容 |
| | 管道命令,能夠理解爲東西從管道的一邊流向另一邊 |
< | 輸出指向, 就是把<後面跟的文件取代鍵盤做爲新的輸入設備 |
perl -e | 是一門解釋型語言,不須要預編譯,能夠在命令行上直接使用。 |
指令 | 做用 | 機器碼 |
---|---|---|
NOP | 空操做指令 | 90 |
JNE | 條件轉移指令,若是不相等則跳轉。 | 74 |
JE | 條件轉移指令,若是相等則跳轉。 | 75 |
JMP | 無條件轉移指令 | E9-EB |
CMP | 比較指令 | 38-3D |
參考資料編程
BOF基礎實踐安全
緩衝區溢出詳解網絡
緩衝區是一塊連續的計算機內存區域,可保存相同數據類型的多個實例。緩衝區能夠是堆棧(自動變量)、堆(動態內存)和靜態數據區(全局或靜態)。dom
若將函數返回地址修改成指向一段精心安排的惡意代碼,則可達到危害系統安全的目的。此外,堆棧的正確恢復依賴於壓棧的EBP值的正確性,但EBP域鄰近局部變量,若編程中有意無心地經過局部變量的地址偏移竄改EBP值,則程序的行爲將變得很是危險。ide
反彙編:objdump -d pwn |more
,反彙編文件,並可翻頁查看函數
十六進制編程器:使用perl -e
命令
cp pwn1 pwn20165211_1
可生成一個和pwn1同樣的文件pwn20165211_1。objdump -d pwn20165211_1|more
將pwn20165211_1反彙編,可獲得如下代碼,可按enter進行瀏覽。在獲得的反彙編結果中,有不少的部分是這個文件所導入的函數,主要部分以下在這裏,咱們能夠看到一行關鍵信息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
查找定位,查看先後的數,發現爲咱們所須要修改的地方。d7
爲c3
:%!xxd -r
將文件轉化爲原格式:wq!
寫文件並退出call
指令後面已變爲getShell
函數,說明修改已成功。foo
函數的Bof
漏洞,觸發getShell
函數。首先明確咱們的目的,在知道了函數getShell
,經過觸發這個函數,便可得到主機的Shell
。實際就是想利用這個可執行文件foo
函數的BOF
漏洞,經過輸入超過長度的字符串buf,便可將返回地址覆蓋變爲getShell
的地址,從而觸發函數。
首先,經過反彙編,明確buf的最大長度有多少?主要看的是foo函數
在紅框框出的位置,咱們能夠看到,給buf分配的棧空間,一共有1c(即爲28)個字節
以下圖,是堆棧的示意圖,咱們能夠看到,EBP佔4個字節,因此,返回地址以前一共有32個字節,故構造的字符串應該是32字節的任意數據加getShell
的地址。
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF12345678
來驗證咱們的想法。輸入gdb ./pwn20165211_2
,來調試改文件,輸入咱們構造的字符串,結果以下圖:此錯誤爲返回地址爲一個無效的地址,查看錯誤信息,發現爲4321的ASCII碼值。則可知道咱們的想法是正確的,那麼接下來就是將1234的位置替換爲getShell
的首地址0804847d
,經過上圖,咱們能夠看到,其地址應該爲逆序的輸入進去則爲輸入應爲\x7d\x84\x04\x08
,
可是,在程序輸入時,咱們沒法直接輸入十六進制值,故使用Perl
語言進行構造咱們須要的輸入語句,存入input1
文件裏,可查看input1
是否符合要求。(\x0a
爲回車)
利用管道語句,將input1
做爲pwn20165211_2
的輸入。查看發現成功得到shell
.
參考資料
在對待一些有BOF漏洞的程序時,這種方法應該是最具備普適性的吧,畢竟不是全部的文件裏面都會藏着一個getShell
。
首先是一些準備工做,經過如下的操做設置堆棧可執行,關閉地址隨機化。
注入本身構造的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的問題了。
首先先寫出咱們的攻擊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,並注入。
啓動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的相關概念,可是基本停留在概念理解上,真正動手去作了,就可以更加了解緩衝區溢出究竟是怎樣去工做的。返回地址的尋找,還有字符串的構造方法,仍是有很大的收穫的。
在如今,其實針對緩衝區溢出,也有不少的防禦方法,可是,緩衝區溢出仍然是一種有效的攻擊手段。就像本次實驗中,其實經過遠程鏈接也能夠完成本次操做,那麼就能夠造成一次有效的攻擊,形成各類安全風險。
什麼是漏洞
- 漏洞是在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷,從而可使攻擊者可以在未受權的狀況下訪問或破壞系統,好比在本次,若你的計算機存在這樣一個文件,且被對方知悉,並無作有效的防禦手段,極有可能被對方得到電腦的操做權,訪問,破壞系統,就垂手可得了。
漏洞有什麼危害
- 會對咱們的信息隱私形成泄露,傳播惡意的軟件,被充當某種大型攻擊的肉雞,小至咱們我的計算機沒法使用,大至國家網絡的癱瘓,都有可能發生。