🥲

pwnのリハビリテーション

に公開

はじめに

pwnとかrevとかもう基礎を何度もやっても忘れてしまいます。

今回はこちらを解きました。その3 オーバーフロー2

gcc overflow.c -o overflow -m32 -fno-stack-protector

覚えておきたいレジスタ基本情報

ちなみにこれはx86の場合です。

レジスタ 名称・使用用途
ebp ベースポインタ
esp スタックポインタ
eip 返り値を保管するレジスタ

関数とスタック

プログラムがメモリにどうロードされるのかをもう一度知るために、kurenaifさんのこちらの動画を見返しました。

スタックはこのような構造になっているそうです。

ローカル変数bがバッファオーバーフローが可能である場合、segfaultが発生するまでアドレスを書き換えることが可能らしいです。

今回脆弱なのは、vuln関数で使用されているstrcmpは比較する文字列の長さを確認しないので、vuln関数の戻り値(mainのアドレス)を書き換えることができます。

通常の動き


これは、用意されたバッファ以内(16byte)にinputの値を収めた時のgdbの表示です。
0x565561f2 <vuln+42> ret <main+51>
という表示から、main関数に戻ろうとしています。

バッファオーバーフローされたとき


適当に550個のAという文字を引数に与えました。すると、レジスタの全てのアドレスが\x41に変わりました。EBPまで変わっているので、さっきの図で見ると、プログラムの終わりまで書き換えています。
これを、vulnからmainに戻るときのメモリを書き換えることで、任意の関数を実行することができます。

Discussion