Почему адрес локальной переменной постоянно меняется при каждом выполнении одного и того же двоичного образа?

У меня есть небольшой фрагмент кода, как показано ниже:

char global=100;        

void main()
{
            char p = NULL;
            printf("%p\n", &p);
            printf("%p\n", &global);
}

Однажды после компиляции и создания двоичного исполняемого образа при каждом выполнении одного и того же двоичного исполняемого файла я вижу разные адреса виртуальной памяти для локальной переменной p.
Однако адрес виртуальной памяти глобальной переменной global остается прежней. Я понимаю схему памяти C; и я ожидаю одно и то же место в памяти для данной переменной при каждом выполнении с использованием одного и того же двоичного изображения.

В чем может быть причина того, что виртуальный адрес, присвоенный локальной переменной, отличается во время выполнения?
Функция всего одна, и нет возможности изменить порядок выполнения функции и тем самым изменить структуру памяти стека.

Результат запуска этой программы 4 раза:

0x7fff181b4b2f
0x601034

0x7ffe34abd62f
0x601034

0x7ffe2813b98f
0x601034

0x7fffcef6b52f
0x601034

person Darshan L    schedule 20.01.2018    source источник
comment
Актуальна ли рандомизация макета адресного пространства??   -  person Joshua Taylor    schedule 20.01.2018
comment
Попробуйте временно отключить ASLR: echo 0 | sudo tee /proc/sys/kernel/randomize_va_space   -  person Francesco Laurita    schedule 21.01.2018


Ответы (1)


Обычно это вызвано рандомизацией макета адресного пространства. Это метод безопасности, предназначенный для предотвращения определенных типов атак, таких как переполнение буфера.

Локальные переменные в размещенной среде обычно хранятся в стеке. В этом случае изменяется адрес виртуальной памяти стека, поэтому тот, кто пытается переполнить буфер и запустить произвольный код, не сможет предсказать адрес, по которому появится вредоносный код.

person dbush    schedule 20.01.2018