web-dev-qa-db-ja.com

ASLR:なぜ32ビットシステムでは12ビットしか変更されないのですか?

ASLRのバイパスについては、こちらの投稿を読んでいます。 32ビットシステムでは、これは取るに足らないことのように見えますが、どれほど簡単かを見て驚いたのです。 ASLRアドレスをブルートフォースするのにほんの数秒しかかかりません。その理由は、私のテストによると、実際にアドレスが変更されるのは12ビットだけだからです。

export BLAH=$"/bin/sh"

BLAH will be at 0xbff5a78b
BLAH will be at 0xbf87778b
BLAH will be at 0xbfe1e78b
BLAH will be at 0xbf9f778b
BLAH will be at 0xbffc378b
BLAH will be at 0xbffd978b
BLAH will be at 0xbfa7f78b
BLAH will be at 0xbf94878b
BLAH will be at 0xbfe4378b
BLAH will be at 0xbff7978b
BLAH will be at 0xbfe4078b

私のラップトップでは、すべてのランダムなアドレスが

BF XX X7 8B

ここで、Xはランダムなヘックスです。 CPUの低レベルの動作に関する私の知識はかなり限られているので、なぜこれらのバイトだけが変化するのですか?

32ビットマシンでは16^3 = 4096 ASLRアドレス '?

64ビットシステムでは何ビット変化しますか?

4
Juicy

32ビットのASLRはかなり制限されていますが、私が見ているのはシステムASLRバイアス値のアーティファクトだと思います。

起動時に、実行中のWindowsの「インスタンス」に対してバイアス値がランダムに生成されます。アドレスの一部は同じプロセスのインスタンス間で同じに見えるかもしれませんが、実際にはバイアス値から供給されているだけであり、その値は再起動時に変更されます。

したがって、実際には、それは実際に悪用されることはありません。アドレスベースはランダムであり、ドライブバイエクスプロイトはインスタンス間でほとんど変化しませんが、失敗する可能性があります。

8
Polynomial

@Polynomialが説明する内容(Windowsを実行しているか、他のオペレーティングシステムを実行しているかによって、適用される場合と適用されない場合がある)に加えて、ASLRはpages[〜#〜] mmu [〜#〜] が知っていることです。ページは4 kB(x86プロセッサー上)であるため、アドレスの下位12ビットはASLRの影響を受けません。これにより、ASLRで使用できる最大20ビットが残ります。アドレススペースの割り当ての問題により、ASLRを介して変更できるビット数がさらに減少する可能性があります(DLLがアドレススペースの周りに散在しすぎると、大きな連続した空きブロックの割り当てを妨げる可能性がありますRAM-これはfragmentation)として知られています。

64ビットOSでは、アドレス空間が大きくなります。 CPUは実際には64ビットをサポートしていないため、完全な64ビットではありませんが、44または45ビットを確認できます(CPUのバージョンとオペレーティングシステムのブランドとバージョンの両方に依存します)。したがって、ASLRによってランダム化された12の追加ビットが得られます。

6
Tom Leek

完全ではないにしても、効果的なセキュリティを提供するには、12ビットで十分です。

マルウェアは、バッファオーバーフローの注入時に1ショットのみを取得します。それが失敗した場合、アプリケーションはプログラムに感染せずにクラッシュするだけです。 12ビットのランダム化は、マルウェアが2 ^ 12、つまり4096回に1回しか機能しないことを意味します。私がマルウェアの作成者またはハッカーである場合、それを試すたびに失敗する可能性が非常に高いことを意味します。

0
John Deters