Rating: 1.0

nc で接続し、そのサーバで実行されたバイナリが渡される pwn。

「日記を保存する機能」「最後に保存した日記を表示する機能」がついたバイナリが渡される。

見たところ最初に「flag」という関数を読んでおり、ファイルを open して特定のメモリのアドレス(少なくとも objdump で見る限りハードコード)に書き込んでいた。

バッファオーバーフローさせるのかと思いきや入力はすべて fgets だった。また、 strchr を呼び出して ‘n’ が含まれているとなぜか「rude!」と表示されて終了する仕様だった。

出力を見ると printf だったので、日記の内容を %d とかにするとその時のスタックの一部のデータが出力された。n がブロックされているので、%n が使えず、メモリに書き込むことはできない。

gdb で見たところ、しばらく先に日記の内容があったので、日記の先頭部分に flag のアドレスを書き、あとは %d でしばらく埋めつつ flag のアドレスが来る場所に %s を置くとフラグが表示された。

Original writeup (https://blog.nhiroki.net/2016/08/27/icectf-2016-writeup).
norajAug. 27, 2016, 1:42 p.m.

not in english