Переменный размер стека - PullRequest
1 голос
/ 29 июля 2010

В моей системе (ядро Linux 2.6.32-24) реализована функция, называемая рандомизацией расположения адресного пространства ( ASLR ).Кажется, ASLR меняет размер стека:

void f(int n) 
{
    printf(" %d ", n);
    f(n + 1);
}

int main(...)
{
    f(0);
}

Очевидно, что при запуске программы вы получите переполнение стека.Проблема заключается в том, что ошибка сегментации происходит при разных значениях «n» при каждом выполнении.Это явно вызвано ASLR (если вы отключите его, программа всегда будет выходить с тем же значением «n»).

У меня два вопроса:ASLR делает размер стека слегка изменяемым?

если да, вы видите проблему в этом факте?Может быть ошибка в ядре?

Ответы [ 2 ]

1 голос
/ 29 июля 2010

ASLR расшифровывается как «рандомизация размещения адресного пространства».То, что он делает, это изменяет различные начальные адреса секций / сегментов при каждом запуске, и да, это включает в себя стек.

Это не ошибка;это по замыслу.Его цель, отчасти, состоит в том, чтобы затруднить получение доступа из-за переполнения буферов, поскольку для выполнения произвольного кода необходимо заставить процессор «возвращаться» к определенной точке в стеке или в библиотеках времени выполнения.Легитимный код знал бы, куда вернуться, но некоторые неубедительные эксплойты не будут - каждый раз это может быть другой адрес.

Что касается того, почему видимый размер стека изменяется, пространство стека выделяется на страницах, а небайт.Изменение указателя стека, особенно если он не кратен размеру страницы, изменяет объем доступного пространства.

1 голос
/ 29 июля 2010

Это может означать, что в одном случае стек попадает в какой-то другой выделенный блок, а в другом случае он отключается по нераспределенному адресному пространству.

...