tmctf2016
用事があって帰省していたので解析等の環境もなくほぼ参加できなかったんですが、一問だけぱっと見て出来そうだったので一応Writeup。
設問とコードは以下のgithubにおいてありますのでざっくり概要だけ。
analysis-offensive 200
自分が見た時には(最初から?)問題分に a simple remote overflow of a global array
とあるし、サーバ側のコードも記載してあるので一目瞭然ですね。
フラグの書き出し処理は pwned
の上位16bitと下位16bitをチェックしていて条件に合えばフラグが返ってくるというもの。
で、この pwned
についてはグローバル変数として int pwned
と char buffer[1024]
で連続したスタックに置かれています。
コード中を見るとソケットから buffer
に対して1028byteの読み込みが行われているのでこのオーバーフローした4byte文でpwnedを書き換えてチェックが通るようにパケットを送信すれば良いというものです。
pwnedは上下16bitづつ特定の値とXORをとった結果を確認しているので比較している値に同じくXORをとってやれば期待される値がわかりますね。
(0xc0fe ^ 0x7eaf) << 16 + (0x1a1a ^ 0xdae4) -> 0xBE51C0FE
ということでサーバーに対して先ほどの4byteのところに上記のデータを送るようなコードを書いてやればレスポンスとしてフラグが返ってきます。 バイトオーダーはまぁリトルエンディアンかなとおもってやったら通った。