🥲
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