sprintf() を含むバグのあるプログラムがあり、それを snprintf に変更してバッファ オーバーフローが発生しないようにしたいとします.. IDA でそれを行うにはどうすればよいですか??
1 に答える
IDA pro からの情報を使用して、そのような変更を行いたくはありません。
IDA の逆アセンブルは比較的高品質ですが、実行可能な書き換えをサポートするほど高品質ではありません。sprintf の呼び出しを snprintf の呼び出しに変換するには、新しい引数をスタックにプッシュする必要があります。これには、新しい命令の導入が必要です。これは、実行可能イメージでそれに続くすべての EA に影響を与えます。これらの有効なアドレスを更新するには、非常に高品質の逆アセンブルが必要です。特に、次のことができる必要があります。
- 実行可能ファイル内のどのアドレスがデータで、どのアドレスがコードであるかを識別します
- どの命令オペランドがシンボリック (アドレス参照) で、どの命令オペランドが数値であるかを識別します。
Ida は (確実に) その情報を提供できません。また、実行可能ファイルが crt に対して静的にリンクされている場合、snpritnf が含まれていない可能性があり、手動での書き換えが非常に困難になります。
潜在的な回避策がいくつかあります。呼び出しを行う関数内 (または呼び出し後) に十分なパディングが利用できる場合、単一の関数を書き直すだけで済む場合があります。または、オブジェクト ファイルにアクセスでき、それらのオブジェクト ファイルが /GY スイッチを使用してコンパイルされている場合 (Visual Studio を使用していると仮定)、オブジェクト ファイルを編集できる場合があります。ただし、オブジェクト ファイルを編集するには、依然として大幅な修正が必要になる場合があります。
ただし、オブジェクト ファイルにアクセスできる場合は、ソースにもアクセスできる可能性があります。ソースを変更するのがおそらく最善の策です。