質問: タイトルの通り バッファオーバーフローに関して質問です。 現在侵入能力とその対策を施せるペネトレーションテスターを目指して セキュリュティを勉強しております。 バッファオーバーフローを持つ脆弱性プログラムに関する シェルコードの埋め込みとエクスプロイトコードに関しては何となくですが理解できております。 しかし、ひとつ疑問が浮かんできました。 エクスプロイトコードをCで記述して作成したとして それをどのタイミングで実行するのでしょうか?? 例えばターゲットバッファオーバーフローの脆弱性を持つサーバーだとしてそのサーバーは ユーザー権限とRoot権限があるとします。 こちらをペンテストとしてハッキングするとしたら まずは、ユーザー権限の奪取から行うと思います。 そうすれば後は、コマンドでCプログラムを実行すれば良いででしょうが 初めから、Root権限の奪取を狙う場合は どのようにしてあらかじめ、作成しておいたエクスプロイコードをコンパイル済みのCプログラムを実行するのでしょうか?? もしかして、IPアドレスとポートを指定して プログラムを実行するコマンドがあるのでしょうか?? 今日も起きてから18時間ぐらいそれについて調べてみたのですが バッファオーバーフローの解説ばかりで肝心なバッファオーバーフローの脆弱性をもつサーバーに対して それらのプログラムを実効する手法が見つけれませんでした。 お分かりになる方ご教示して頂ければと思います。 よろしくお願い致します。
回答: バッファオーバーランを利用して、コード実行を行う手法として、**Return-to-libc**というものがあります。 関数から戻る際に、戻り先のアドレスが必要となりますが、その戻り先をバッファオーバーランで(主にlibcにある関数のものに)書き換え、さらに引数もお膳立てすることで、ライブラリ関数を実行させることができます。`system()`でシェルを呼ぶこともできます。 いまどきのOSにはデータ実行拒否機能があるので、スタックやヒープをオーバーフローさせてコードを書き込んでも、それを実行させるにはさらに工作が必要ですが、戻り先の書き換えであればそれも不要です。