たとえば、Windows XP プラットフォームにいて、ollydbg にプログラム A があり、命令 x を調べます。たとえば、アドレス0x11111111を持っています。プログラムAを使用して、同じプラットフォームの別のコンピューターでollydbgを実行すると、命令xは同じアドレス0x11111111になりますか? 私の質問は次のとおりです。プログラム A が実行されるたびにメモリ アドレスが変更されますか? または、別のコンピューターまたはプラットフォームで変更されていますか?
4 に答える
表示されているのは仮想アドレスです。CPU には、オペレーティング システムだけが認識できる特別なレジスタが含まれています。これらのレジスタは、仮想メモリから物理メモリへのマッピングを制御します。OS が別のプロセスに切り替わるたびに、これらのレジスタを再プログラムして、メモリが常に同じ場所にあるとプログラムが認識できるようにします。
Windows PE バイナリは位置に依存しません。つまり、実行元の固定アドレスを想定する必要があります。Microsoft は、実行パフォーマンスを向上させるためにこれを行っています (読み込み時間のペナルティを犠牲にして)。
バイナリは常に必要な場所から実行されますが、優先アドレスが他のコードによって既に使用されている場合、DLL は再配置される可能性があります。
再配置は透過的です。Windows バイナリ ローダーがコードを変更し、新しい場所で機能するようにすべてのアドレスを修正します。
アーキテクチャによって異なりますが、これらのアドレスが同じであることに依存しないでください。実用的な目的では、答えはノーです。
あなたのコメントに答えるために、エクスプロイトは自分がどこにいるかを見つける必要があります。これを行う簡単な方法は、次のように呼び出しを行い、返信先アドレスをポップすることです。
call test_eip
test_eip:
pop eax
この場合、命令ポインターは にありeax
ます。これは、挿入されたコードの場所を特定するのに役立ちます。
もちろん、主にバッファ オーバーフロー エクスプロイトを使用して、これを実行する必要があります。
ウィキペディアは - いつものように - 素晴らしい説明と注意すべき多くのリンクを提供しています: http://en.wikipedia.org/wiki/Stack_buffer_overflow
同じ実行可能ファイルを含む同じ OS バージョンでは、同じコード アドレスが表示される可能性がありますが、確実ではありません。OS のバージョンが異なります。可能性は低いです。