tmctf2016

用事があって帰省していたので解析等の環境もなくほぼ参加できなかったんですが、一問だけぱっと見て出来そうだったので一応Writeup。

設問とコードは以下のgithubにおいてありますのでざっくり概要だけ。

github.com

analysis-offensive 200

自分が見た時には(最初から?)問題分に a simple remote overflow of a global array とあるし、サーバ側のコードも記載してあるので一目瞭然ですね。

フラグの書き出し処理は pwned の上位16bitと下位16bitをチェックしていて条件に合えばフラグが返ってくるというもの。 で、この pwned についてはグローバル変数として int pwnedchar buffer[1024] で連続したスタックに置かれています。

コード中を見るとソケットから buffer に対して1028byteの読み込みが行われているのでこのオーバーフローした4byte文でpwnedを書き換えてチェックが通るようにパケットを送信すれば良いというものです。

pwnedは上下16bitづつ特定の値とXORをとった結果を確認しているので比較している値に同じくXORをとってやれば期待される値がわかりますね。

(0xc0fe ^ 0x7eaf) << 16 + (0x1a1a ^ 0xdae4) -> 0xBE51C0FE

ということでサーバーに対して先ほどの4byteのところに上記のデータを送るようなコードを書いてやればレスポンスとしてフラグが返ってきます。 バイトオーダーはまぁリトルエンディアンかなとおもってやったら通った。