2

Windbg を使用して Windows 10 マシンでプログラムを実行し、最初のブレークポイントで中断させます。スタックの物理的な最下部 (TEB の stackBase) のアドレスを取得し、 のrsp値を減算しますntdll!LdrInitializeThunk。同じプログラムでこれを 5 回実行したところ、5 つの異なる値が得られました。

0x600
0x9f0
0xa40
0x5d0
0x570

などで同じことを行うと、同様の結果が得られますntdll!RtlUserThreadStart。これは、スタックの「論理的な底」が多少ランダム化されていることを示唆しています。何故ですか?これは、スタック内のある種の「ミニ ASLR」ですか? これはどこかに文書化されていますか?

4

1 に答える 1

1

具体的には、Vista の ASLR (ASLR は Vista で導入されました) をグーグルで調べた後、Symantec からこのドキュメントを見つけました。5ページで、私の質問の対象となる現象について言及しています(私のものを強調してください):

スタックが配置されると、初期スタック ポインターは、ランダムな減分量によってさらにランダム化されます。初期オフセットは最大で半分のページ (2,048 バイト) になるように選択されますが、自然に整列されたアドレスに制限されます [...]

したがって、セキュリティ上の理由から意図的に行われているようです (この方法では、スタック ベースに対する固定オフセットに存在するもののアドレスを把握するのが難しくなります)。

誰かがより洞察に満ちた答えを提供できることを期待して、この質問をしばらく開いたままにします。誰も同意しない場合は、この回答を受け入れます。

于 2016-07-06T09:50:41.743 に答える