fr33f0r4llスマートフォン用の表示で見るfr33f0r4ll自分用雑記この広告は、90日以上更新していないブログに表示しています。spiritまで来た。spirit自体の解説はhttps://github.com/shellphish/how2heap、問題はhttps://github.com/ctfs/write-ups-2014/tree/master/hack-lu-ctf-2014/oreoにある。Writeupはなしで解けた!問題fileとchecksecは以下。(0x8048000)x86でセキュリティ機構は普通。Rifleを購入するプログラムになっていて、名前や説明の入力をして注文したり、メモのようなものを残すことができる。解析Radareで解析してマニュアルデコンパイルしたコードは以下。return;}ちょっと整理されてない。add_rifleに脆弱性があり、バッファのサイズを指定するべき場所に構造体tmp_stのサイズが指定されているため、ヒープ上でのバッファオーバーフローが存在している。よってtmp_st.nameから0x38だけ任意の値に書き換えられる、例えばnextとか。これによりリンクリストの次の領域を任意のアドレスに指定できるので、任意の領域をfreeすることができる。spirit簡単に説明すると、chunkと同じように値を設定してやることでheap領域以外をfreeしてfastbinsに繋ぐ攻撃である。することで任意の領域をmallocに返させて、値を書き込んだりできるようになる。spiritを使うことは分かっているので、それを意識して考えてみた。すると、グローバル変数の値を適切に設定してやれば、ヒープオーバーフローでfreeさせられそうだと思い付いた。msgあたりをmallocで返したい。そこで、msgの上のlist_countにサイズを設定しmsgをfreeすることで、次のadd_rifleで指しているアドレスを改ざんできるようにすることを目指した。spiritによりadd_rifleでアドレスを改ざんできるようになったので、書き換えるべきアドレスを探した。GOTを書き換えられるので、ユーザの入力を受け取る標準関数sscanfを書き換えることにした。libcのバージョンを特定する必要があったため2つ以上の関数のアドレスをリークさせる必要があるがsscanfは一番最後の領域にあったため直接sscanfを指すようにしてしまうとうまくlibcのリークとGOTの書き換えが両立できない。そこで、ひとつ上のlibc_mainを指定してリークと書き換えが1度にできるようにした。'\0')io.interactive()まとめ時間はかかったけど自力で解けたので嬉しい。(1)はてなブログをはじめよう!hiziriAIさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。