5

ASLRされたdllイメージの32ビットプロセスのベースアドレスを見ました。
完全なランダム化ではありません。確率の1/2をランダム化しただけです。

たとえば、dllをロードすると、画像は0x12345678にロードされます。
そして、画像を再度ロードすると、画像は0x23456789にロードされます。(ベースアドレスが変更されました!)
しかし、画像を再度ロードします
0x12345678
0x23456789
0x12345678
0x23456789

.. ..

なぜ彼らはこのように実装したのですか?
クラッシュレポートの頻度ですか?(再デプロイされたdllと同じクラッシュアドレスを取得するため)

4

3 に答える 3

13

これは仕様によるものです。通常、WindowsはDLLが最初にロードされるときにASLR DLLの優先ベースアドレスを選択し、システムが再起動されるまでそのアドレスを使用し続けます。そうすれば、DLLは、それをロードするすべてのプロセスで同じアドレスにマップされ、コードページを共有できるようになります。

ただし、DLLがすべてのプロセスからアンロードされている場合、システムは、DLLが次にロードされるときに別のベースアドレスを選択することがあります。これは、セキュリティ上の理由ではなく、仮想アドレス空間の断片化を減らすために行われます。これはあなたの場合に起こっているようです。

于 2010-09-08T06:11:54.007 に答える
2

256の可能な開始アドレスの1つにあると文書化されています。

しかし、それがプロセスに適用されるとは思いませんでしたが、共有DLLに適用されると思いました。

ASLR:プロセスイメージではデフォルトでオンになっていません。互換性のためのオプトインです。(3

アドレス空間配置のランダム化(ASLR)

ASLRは、システムの起動時に実行可能イメージをランダムな場所に移動するため、エクスプロイトコードが予測どおりに動作するのが難しくなります。コンポーネントがASLRをサポートするには、ロードするすべてのコンポーネントがASLRもサポートしている必要があります。たとえば、A.exeがB.dllとC.dllを使用する場合、3つすべてがASLRをサポートする必要があります。デフォルトでは、Windows Vista以降はシステムDLLとEXEをランダム化しますが、ISVによって作成されたDLLとEXEは、/DYNAMICBASEリンカーオプションを使用してASLRをサポートするようにオプトインする必要があります。

ASLRは、ヒープとスタックのメモリもランダム化します。

  • アプリケーションがWindowsVista以降でヒープを作成する場合、ヒープマネージャーはランダムな場所にそのヒープを作成し、ヒープベースのバッファーオーバーランを悪用する試みが成功する可能性を減らします。ヒープのランダム化は、WindowsVista以降で実行されているすべてのアプリケーションでデフォルトで有効になっています。

  • スレッドが/DYNAMICBASEにリンクされたプロセスで開始すると、Windows Vista以降はスレッドのスタックをランダムな場所に移動して、スタックベースのバッファオーバーランの悪用が成功する可能性を減らします。

于 2010-09-07T01:56:04.760 に答える
0

昨日、新しいWin8RCx64をインストールしました。

気を付けて!

Kernel32.dll(64ビットバージョン)は、プロセスごとに(もちろん、単一セッションで)異なるベースアドレスを持っています。ntdll.dllベースアドレスのみが一定のままです。コードを変更する必要がありました。永続アドレスLoadlibraryに依存することはできなくなりました。

于 2012-06-10T10:28:37.600 に答える