7

MITのプレゼンテーションで、さまざまな種類の ASLR 実装について説明しています。

たとえば、静的 ASLR の場合、スタックには 19 ビットのエントロピーがあると指摘しています。私の理解では、これは、スタック ベース アドレスをランダム化して 2^19 の異なる値を取ることしかできないことを意味します。

スタックに 19 ビットのエントロピーがあることを計算する方法を知りたいですか?

編集:

オンラインで確認したところ、Linux のスタック ASLR に関する説明が見つかりました。別の質問から学ぶと、関連すると思われるコードは次のとおりです。

#ifndef STACK_RND_MASK
#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12))     /* 8MB of VA */
#endif

static unsigned long randomize_stack_top(unsigned long stack_top)
{
    unsigned int random_variable = 0;

    if ((current->flags & PF_RANDOMIZE) &&
            !(current->personality & ADDR_NO_RANDOMIZE)) {
            random_variable = get_random_int() & STACK_RND_MASK;
            random_variable <<= PAGE_SHIFT;
    }
#ifdef CONFIG_STACK_GROWSUP
    return PAGE_ALIGN(stack_top) + random_variable;
#else
    return PAGE_ALIGN(stack_top) - random_variable;
#endif
}

ここが私の質問の理由を説明する適切な場所であるかどうかを尋ねたいですか?

4

1 に答える 1

7

まず、ページを 4096 バイト境界に揃える必要があります。これにより、下位 12 ビットが事実上ゼロになります。

次に、カーネルはアドレス空間0x00000000 - 0xbfffffffをユーザー メモリ0xc0000000 - 0xffffffff用とカーネル メモリ用に分割します。ここではユーザー メモリのみを考慮しているため、カーネル メモリは無視できます。

ユーザーアドレス空間をさらに 3 つの範囲に分割すると、次のようになります。

       Range        | 2 MSBs 
--------------------+--------
00000000 - 3fffffff |   00
40000000 - 7fffffff |   01
80000000 - bfffffff |   10

通常、スタックが最初の範囲にあることは望ましくありません。これは、ヒープが存在する場所だからです。これは、最上位 2 ビットの可能な組み合わせが 2 つしかないことを意味0110、実質的に 2 ビットを 1 に変換します。

32 ビット アドレスには 32 ビットがあるため、19 ビットのスタック エントロピーを次のように取得できます。
32 - (page alignment bits) - (memory partitioning bits) = 32 - 12 - 1 = 19

于 2016-05-29T17:04:23.607 に答える