2012-03-17 7 views
3

RECT(Return-Oriented Programming)技術を使用してgets()関数の脆弱性を利用しようとしています。ターゲットプログラムは、ある時点で何らかの入力を求めてからgets()を使用して入力をローカルの80文字の長さの配列に格納するWindowsコンソールアプリケーションです。
冒頭に80文字を含むファイルを作成し、古いEIPポインタを上書きするための余分な文字+ 0x5da06c48アドレスを作成しました。
ファイルをテキストエディタで開き、コンテンツを入力としてコンソールにコピーペーストしています。私はgets()関数からの戻りの直後にブレークポイントを設定するためにIDA Pro(またはOllyDbg)を使用し、アドレスが破損していることに気付きました - 0x3fa03f48(2回の3f置換)に設定されていました。
私は他のアドレスも試してみましたが、その一部はうまくいきましたが、ほとんどの場合アドレスが壊れています(文字がないか置換されている、時には切り捨てられることがあります)。
この問題を解決するにはどうすればよいですか?どんな提案も高く評価されます!gets()ROPの悪用を伴うWindowsコンソールアプリケーション

+0

@ NiklasB。 getはどんな境界チェックもしません。 –

+0

ああ、もちろん、あなたは正しいです...あなたが記述した問題を示す最小のCサンプルプログラムを提供できますか?私は自分でデバッガで実行したいと思っています。なぜなら、あなたが説明していることは私にはあまり起こりそうにないからです。私はなぜそれが読まれた後に入力が何らかの方法で妨害されるのはなぜ「得る」かわからない。私が想像できる唯一のことは、ペイロードの中にヌルバイトまたは改行(0x0aまたは0x0d)があることです。 –

+0

私はペイロードにbadバイトが含まれていないことを保証しました。たとえば、[Wikipedia example](http://en.wikipedia.org/wiki/Stack_buffer_overflow#Exploiting_stack_buffer_overflows)をコンパイルすることができます:strcpy呼び出しをget c); –

答えて

-1

まず、お使いのプラットフォームのEndiannessを確認してください。あなたのビットが正しい順序であると思っても、依然として不正な入力がある場合、シェル/テキストエディタはバイナリセーフではないかもしれません。 Subprocessライブラリを使用して、Pythonなどのスクリプト言語でこの欠陥の悪用を行う方がよいでしょう。これにより、任意のプロセスのstdinパイプに直接データを書き込むことができます。

1

バイナリデータのコピーペーストはヒットアンドミスです。入力リダイレクトを使用してファイルから直接入力をテストプログラムに入力しようとしましたか?

関連する問題