Биты энтропии ASLR для стека в Linux

Я просматриваю презентацию от Массачусетского технологического института, где они объясняют различные типы реализации ASLR.

Например, они указывают, что для статического ASLR стек имеет 19-битную энтропию. Насколько я понимаю, это означает, что базовый адрес стека может быть рандомизирован только для того, чтобы принимать 2^19 различных значений.

Я хочу спросить, как рассчитать, что стек имеет 19-битную энтропию?

Изменить:

После проверки в Интернете я нашел некоторые объяснение стека ASLR в Linux. Изучая другой вопрос, код, который, по моему мнению, может иметь значение:

#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
}

Я хочу спросить, это правильное место, чтобы рассуждать о моем вопросе?


person Jake    schedule 11.03.2016    source источник


Ответы (1)


Во-первых, страницы должны быть выровнены по границам 4096 байт, что эффективно обнуляет младшие 12 бит.

Затем ядро ​​разбивает адресное пространство на 0x00000000 - 0xbfffffff для пользовательской памяти и 0xc0000000 - 0xffffffff для памяти ядра. Здесь нас интересует только пользовательская память, поэтому память ядра можно игнорировать.

Если мы далее разделим адресное пространство пользователя на три диапазона:

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

Как правило, нам не нужен стек в первом диапазоне, поскольку именно там находится куча. Это означает, что у нас есть только две возможные комбинации для двух самых значащих битов, 01 и 10, эффективно превращающие 2 бита в 1.

У нас есть 32 бита в 32-битном адресе, поэтому мы можем получить нашу 19-битную энтропию стека с помощью:
32 - (page alignment bits) - (memory partitioning bits) = 32 - 12 - 1 = 19

person 小太郎    schedule 29.05.2016
comment
Большое спасибо, но еще один вопрос: так что означает сегмент глобальной переменной, возможно, в стеке или под областью стека? - person roachsinai; 11.01.2020