GRADUATION
スタックオーバーフローで、実行の流れを書き換えられるようになりました。
自作のgets()付きプログラムを、意図的に保護を切ってビルドし、リターンアドレスを既存のwin関数のアドレスで上書きすることで、想定と違う関数を実行させました。同じ入力を、デフォルトの保護(スタックカナリア)付きでビルドすると弾かれることも確認し、「保護が何を防いでいるか」を体で理解しました。
おつかれさまでした。
持ち帰るもの
- リターンアドレスは、バッファのすぐ先にあるローカル変数の後ろに保存されたrbpとリターンアドレスが並びます。バッファのサイズと構造を読めば、書き換えるべきオフセットが分かります。
- 保護は、外さない限りかかっている-fno-stack-protector・-no-pieのようなオプションを付けて初めて崩せました。デフォルトのgccビルドはスタックカナリアで同じ攻撃を検知し、プロセスを強制終了します。
- 今回は「既存の関数に飛ばす」だけシェルコードの注入やROPチェーンの構築はしていません。あくまで、あらかじめ用意されたwin関数へリターンアドレスを差し替えただけです。
次にやるといいこと
- 次は、残されたデータを掘るforensicsです。
- このコースで見た保護機構(カナリア/NX/PIE)は、実務のビルド設定を読むときの手がかりになります。