Псевдослучайный указатель вершины стека в соответствии с Linux?

Я играл вокруг с некоторым кодом, когда я заметил что-то странное:

[~] main% cat test.cc
#include <stdio.h>

void f()
{
    int i;
    fprintf(stderr, "&i = 0x%08X\n", (long)&i);
}

int main(int argc, char**argv)
{
    f();
}
[~] main% g++ test.cc
[~] main% ./a.out
&i = 0xBFA27AB4
[~] main% ./a.out
&i = 0xBFAD7E24
[~] main% ./a.out
&i = 0xBFCA3464
[~] main% ./a.out
&i = 0xBF96C064
[~] main%

Нечетной вещью мне является вариация в адресе переменной i.

Мое предположение - то, что ядро предоставляет различные начальные адреса стека, чтобы попытаться мешать некоторой трещине. Какова настоящая причина?

8
задан Richard Pennington 17 December 2009 в 12:38
поделиться

1 ответ

Рандомизация разметки адресного пространства используется в нескольких операционных системах именно по этой причине. Ваш вариант адреса указателя стека вполне может быть вызван этим - очень вероятно, что это имеет место в последних версиях Linux и / или * BSD. Последние версии Windows IIRC также делают то же самое.

13
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: