マイクロソフトの記事から:
アドレス空間レイアウトのランダム化 (ASLR)
ASLR は、システムの起動時に実行可能イメージをランダムな場所に移動するため、エクスプロイト コードが予測どおりに動作することが難しくなります。コンポーネントが ASLR をサポートするには、そのコンポーネントが読み込むすべてのコンポーネントも ASLR をサポートする必要があります。たとえば、A.exe が B.dll と C.dll を使用する場合、3 つすべてが ASLR をサポートする必要があります。既定では、Windows Vista 以降ではシステム DLL と EXE がランダム化されますが、ISV によって作成された DLL と EXE は、/DYNAMICBASE リンカー オプションを使用して ASLR をサポートするように選択する必要があります。
よくわかりません。Windows 上のすべてのプロセスによってロードされる基本システム DLL を取り上げNtDll.dll
ますkernel32.dll
。
非対応の実行可能ファイルがある場合、これらのシステム DLL は ASLR を使用しますか? つまり、この実行可能ファイルは、Win 7 でシステムを再起動するたびに異なるベース アドレスにロードされますか? それとも、Win XP のように、システムの再起動後に常に同じベース アドレスにロードされますか?
私の言いたいことをより明確にするために:私の典型的なダミープログラムの起動スタックは次のようになります:
write_cons.exe!wmain() Line 8 C++
write_cons.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C
write_cons.exe!wmainCRTStartup() Line 403 C
> kernel32.dll!_BaseProcessStart@4() + 0x23 bytes
の asmBaseProcessStart
を見ると、XP ボックスに次のように表示されます。
_BaseProcessStart@4:
7C817054 push 0Ch
7C817056 push 7C817080h
7C81705B call __SEH_prolog (7C8024D6h)
7C817060 and dword ptr [ebp-4],0
...
今、私が興味を持っているのは次のことです:
Windows XP では、このマシンを何度再起動しても、アドレスは常に0x7C817054 になります。ASLR を使用して Win7 を使用している場合、kernel32.dll をロードする実行可能ファイルがASLR に対して有効になっていない場合、このアドレスは再起動ごとに変更されますか?
(注: 私にとって、このアドレスが役立つマイナーなユースケースは 1 つだけです。Visual Studio では、アセンブリ レベル関数の「データ ブレークポイント」、つまりブレークポイント @ 0x7 のみを設定できます。 . - 特定の ntdll.dll または kernel32.dll 関数でブレークしたい場合、Windows XP では、再起動の間にブレークポイントを調整する必要はありません.ASLR が開始された場合 (この質問の範囲)、変更する必要があります再起動間のデータブレークポイント。)