又到了一年一度的駭客界盛事 Defcon ctf qual 的……. 半個月後了,期末考終於有時間來寫個 write up 了XD 由於沒有在時間內解完,所以這篇算是事後腦補文!
沒在時間內解出卡住的點是,沒有看出有 setrlimit 的限制以及,腦袋轉的不夠快沒有想到利用 ROP 去 leak memory address
Pwnables 100
題目描述
Pwn it! Running on 140.197.217.85:1994 Download the binary
檔案可以在這下載
http://rdlabs.org/dc20qual/pwn100-mv6bd73ca07e54cbb28a3568723bdc6c9a
連進去長得像這樣
可以用 binutils 的 file 觀察發現是 MIPS 架構的 ELF binary
1 | orange@z:~/ctf$ file pp100 |
環境可以利用 QEMU 架起來,可參考 這篇
1 | qemu-system-mipsel.exe \ |
想要網路的話加上參數 -net user
& -net nic
,想到 forward port 的話加上參數 -redir tcp:22::22
(Host OS 22 port to Guest OS 22 port),QEMU 長得像這樣
接著開始進行分析,配合 IDA pro 觀察,在 gdb 中會發現在 png2ascii
指令內超過一定長度會產生 Segmentation fault. 慢慢減少字串長度發現在 260 bytes 後的字元可以覆蓋到 PC
python -c “print ‘png2ascii\n’ + “0”*260 +’A’*4” | nc 0 1994
很簡單的 Buffer overflow 不過是 MIPS ~“~
可以很快地寫出 Exploit 但是 shellcode 有大小限制 ,網路上的皆無法使用所以只好自己寫 = =||| (網路上的 shellcode 是考慮到 null byte,所以利用變形的方式繞過所以寫得又臭又長,而且還有寫錯的“)
要注意的點
- MIPS 有分 Big endian 以及 Little endian,可以從 “\xc0\x01\x01\x01” or “\x01\x01\x01\xc0” 看出
- syscall 值 可以參考 /usr/include/asm/unistd.h
- MIPS 參數傳遞由 a0,a1,a2,a3 下去
- MIPS 回傳值位於 ra
- 字串放進 stack 內位置要對齊,不然會寫得很幹!
透過 gdb, gcc, objdump, strace 可以寫出 shellcode,大致如
setrlimit -> socket -> connect -> dup2(將 stdout, stdin, stderr 轉至 fd) -> execv
Reference 中另外一隊的寫法是直接將當前連線當成資料交換的地方,直接 dup2,更厲害讓 shellcode 更短
1 | void main() { |
總共長度為 176 bytes,接下來的問題就是如何找到 shellcode 在 stack 的位置
利用 Return Oriented Programming (ROP) 可以跳至 syscall __NR_send
的位置,並且參數可以自己控制最終將 Remote 的記憶體資料讀回來找出 shellcode 位置,最終的 Exploit python code
1 | import socket |
Reference:
http://blog.lse.epita.fr/articles/17-defcon2k12-prequals-pwn100-writeup.html
http://www.exploit-db.com/exploits/18226/
http://www.thc.org/root/docs/exploit_writing/mipsshellcode.pdf