web-dev-qa-db-ja.com

ヒープアドレスはASLRによってランダム化されますか?

私は読んでいます このInternet Explorerの悪用に関する記事 と、ヒープスプレーの「作業」によってメモリアドレスが影響を受ける理由について少し混乱しています。

この論文では、攻撃はヒープスプレーを使用して、320MB相当の0x12121212をスプレーしていると述べています。このアドレスが選択されたのは、攻撃が0x12121212とその周辺のメモリを制御するためです。実際、メモリアドレス0x12121212は、ROPチェーンが配置される場所です。

ASLRが有効になっているとなぜこれが機能するのか混乱しますが、メモリアドレスは毎回ランダム化されませんか?

0x12121212を確実に使用できるのはなぜですか?

7
MikeTGW

Windows Internals 5th Editionブックによると、ヒープの5ビットASLRバイアスは「64KBを掛けて、0から始まり、初期ヒープに0x00000000〜0x001F0000の可能な範囲を与える最終的なベースアドレスを生成します」。

したがって、IEの初期ヒープは常に0x00000000と0x001F0000の間であり、32の可能な場所があります。ヒープに320MBのデータ(0x14000000バイト)を埋めることで、攻撃者はほぼ0x12121212アドレスが入力されていることを確実に保証します。

  • 低アドレスの場合(ヒープは0x00000000に作成されます):0x00000000から0x14000000までのすべてのアドレスを埋めるため、0x12121212が埋められます。
  • 高アドレスの場合(ヒープは0x001F0000に作成されます):0x001F0000から0x141F0000までのすべてのアドレスを埋めるため、0x12121212が埋められます。

これは、アプリケーションが/HIGHENTROPYVAフラグを使用してコンパイルされる64ビットWindows 8以降で軽減されます:ヒープのASLRバイアスのサイズは24ビットであり、メモリー上のヒープの可能な位置は16,777,216になります。 1TBのアドレス空間。

ASLRの詳細については、 BlackHat 2012の講演「Windows 8でのエクスプロイト緩和機能の改善 」を参照してください。

6
Polynomial