2

マイクロソフトの記事から:

アドレス空間レイアウトのランダム化 (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 が開始された場合 (この質問の範囲)、変更する必要があります再起動間のデータブレークポイント。)

4

2 に答える 2

4

リンカーはアドレスではなくシンボルにバインドするため、技術的には、システム dll が再配置されるかどうかは問題ではありません。これらのシンボルは、ランタイム ローダーによって、インスタンス化されたシステム dll のアドレスに解決されるため、バイナリは賢明ではありません。ただし、私が見たものから、Windows 7 は、システム dll を含む再起動のたびにベースのランダム化をリセットします (注: これは、widows サーバー 2008 R2 での WOW64 アプリのデバッグによるものです)。いくつかの登録編集を介して ASLR をシステム全体で無効にすることもできますが、それは実際には関係ありません...

アップデート:

この記事の ASLR に関するセクションでは、何がいつ再配置されるかについて説明しています。ベースが再起動のたびにリセットされるかどうかは言及されていませんが、システム dll の場合、同じアドレスで 2 回読み込まれるか、再起動するかどうかは保証されません。重要なことは、記事によると、システム dll を再配置するには、すべてを ASLR にオプトインする必要があることです。

于 2011-06-18T13:28:12.377 に答える
1

プログラムは、システム DLL がロードされた場合に呼び出しを解決します。ただし、実行可能ファイルが /DYNAMICBASE にリンクされていない限り、ランダム化されたベース アドレスは与えられません。つまり、exe は常に同じベース アドレスにロードされます。

exe をランダムなアドレスにロードする場合は、exe を /DYNAMICBASE にリンクする必要があり、exe が参照するすべての DLL も /DYANMICBASE にリンクされている必要があります。システム DLL (Vista 以降) はすべて /DYNAMICBASE にリンクされています。

于 2011-06-18T13:51:05.823 に答える