私は (学習目的で) リターン指向プログラミング (ROP) 手法を使用して gets() 関数の脆弱性を利用しようとしています。ターゲット プログラムは、ある時点で何らかの入力を要求し、gets() を使用して入力をローカルの 80 文字長の配列に格納する Windows コンソール アプリケーションです。
先頭に 80 個の「a」文字 + いくつかの余分な文字 + 古い EIP ポインターを上書きするための 0x5da06c48 アドレスを含むファイルを作成しました。
テキスト エディターでファイルを開き、内容を入力としてコンソールにコピー アンド ペーストします。IDA Pro (または OllyDbg) を使用して gets() 関数から戻った直後にブレークポイントを設定しましたが、アドレスが壊れていることに気付きました - 0x3fa03f48 (2 つの 3f 置換) に設定されていました。
私は他のアドレスも試しました - それらの一部はうまくいきますが、ほとんどの場合、アドレスが壊れています (文字が抜けたり、置換されたり、切り捨てられたりすることがあります)。
この問題をどうやって乗り越えますか?どんな提案でも大歓迎です!
2 に答える
1
バイナリデータのコピーと貼り付けは失敗に終わります。入力リダイレクトを使用して、ファイルから直接テストプログラムに入力をフィードしようとしましたか?
于 2013-01-08T15:41:00.010 に答える
-1
まず、プラットフォームのエンディアンを追跡します。ビットが正しい順序になっていると思われるのに、不正な形式の入力が得られる場合は、シェル/テキスト エディターがバイナリ セーフではない可能性があります。任意のプロセスの stdin パイプに直接データを書き込むことを可能にするSubprocessライブラリを使用して、Python などのスクリプト言語でこの欠陥のエクスプロイトを作成することをお勧めします。
于 2012-07-10T23:18:51.000 に答える