0

私の知る限り、ASLR アドレス空間レイアウトのランダム化は、システムの起動ごと (再起動ごと) にのみランダムな再配置を行います。

アドレス空間レイアウトのランダム化 (ASLR)

ASLR は、システムの起動時に実行可能イメージをランダムな場所に移動するため、エクスプロイト コードが予測どおりに動作することが難しくなります。(...)

この場合、Windows を繰り返し再起動してランダム性が発生することを期待せずに、C++ モジュールまたはシステム モジュール(たとえば) に対して ASLR が発生していることを「テスト」または確認するにはどうすればよいでしょうか?kernel32.dll

4

1 に答える 1

1

これは私が試みることです:

モジュールのHMODULEハンドルは、実際にはモジュールのイメージのベースアドレスであることに注意してください。GetModuleHandleこの値を取得するために使用できます。これを画像のオプションのヘッダー値のベースアドレスと比較すると、ASLRがオンになっている場合、これら2つの値は異なると予想されます。

GetModuleHandleこれは、特定のシステムDLLで使用された場合にのみ、ASLRの明確な指標になることに注意してください。kernel32それは画像再配置の典型的な候補ではないので、それはうまくいくでしょう:

  1. MicrosoftシステムDLLには、すべて固有の推奨ベースアドレスが与えられています。と
  2. これは、プロセスアドレス空間にマップされた最初のDLLの1つです。

通常は再配置されないためkernel32、ASLRがオフになっている場合は、推奨されるベースアドレスにロードされると予想するのが妥当です。

画像ヘッダーから推奨ベースアドレスをどのように取得しますか?最も簡単な方法は、DUMPBINVisualC++に含まれているユーティリティを使用することです。プログラムで実行したい場合は、IMAGE_OPTIONAL_HEADER構造体のImageBaseフィールドが見つかるまで、実行可能イメージのヘッダーを調べていく必要があります。PEヘッダーの詳細については、 MattPietrekによる Win32PortableExecutableFileFormatの詳細」をお勧めします。

于 2011-08-22T15:31:32.817 に答える