因為程式在吃 gets
之後,跑 puts
之後就會離開,所以我們要影響程式的執行路徑。
puts@got
的位置system()
位置因為我們可以蓋 RIP,故可以串起 ROP 攻擊鏈。
一開始我們需要找到程式中有 pop ret
的地方。在這程式中,剛好在 0x400753
中可以用。這個可以用 pwntools
或 peda
(gdb 工具) 來找。
所以我們第一步會是把 RIP 蓋成 0x400753
。
我們手上有這程式用的 libc ELF,所以我們可以透過 leak 某函式位置,倒推出 libc 的位置。
因為我們第一步已經會執行 pop ret
,所以可以直接把接下來要執行的東西寫在後面。
pop ret
位置gets@got
位置puts@plt
位置libc 中 symbols
的位置此時我們若把這些東西送出去,就可以看到返回的 libc
中 system()
的位置。
利用這份資訊,在第二次送出時,即可用一樣的套路來執行 shell。
SECCON 2018 Online CTF Writeup - yyy