Я думаю, что вы неправильно понимаете эффекты ASLR (рандомизации размещения адресного пространства): ASLR случайным образом размещает позиции разных областей виртуальной памяти процесса (исполняемый, стек, куча, данные, библиотеки и т. Д.) В каждомвыполнение.Он не меняет относительное положение элементов в одной и той же области виртуальной памяти.
Возьмем, к примеру, следующую простую программу:
int main(void) {
struct {
char a[10];
char b[10];
} myvar;
printf("a: %p\n", &myvar.a);
printf("b: %p\n", &myvar.b);
return 0;
}
Вот виртуальная память программы с ASLR отключено :
0x555555554000 0x555555555000 r-xp 1000 0 /home/marco/test/test [executable segment]
0x555555754000 0x555555755000 r--p 1000 0 /home/marco/test/test [read only data]
0x555555755000 0x555555756000 rw-p 1000 1000 /home/marco/test/test [bss (global variables)]
0x7ffffffde000 0x7ffffffff000 rw-p 21000 0 [stack] <-- myvar is here
Вывод (ASLR отключен):
$ ./test
a: 0x7ffffffde080
b: 0x7ffffffde08a
$ ./test
a: 0x7ffffffde080
b: 0x7ffffffde08a
$ ./test
a: 0x7ffffffde080
b: 0x7ffffffde08a
А вот та же программа с включенным ASLR :
0x559fefcbe000 0x559fefcbf000 r-xp 1000 0 /home/marco/test/test [executable segment]
0x559fefebe000 0x559fefebf000 r--p 1000 0 /home/marco/test/test [read only data]
0x559fefebf000 0x559fefec0000 rw-p 1000 1000 /home/marco/test/test [bss (global variables)]
0x7ffe3bb5e000 0x7ffe3bb7f000 rw-p 21000 0 [stack] <-- myvar is here
Вывод (ASLR включен):
$ ./test
a: 0x7ffe3bb5e080
b: 0x7ffe3bb5e08a
$ ./test
a: 0x7ff4abdeea80
b: 0x7ff4abdeea8a
$ ./test
a: 0x7efa6b8fa080
b: 0x7efa6b8fa08a
Ваша переменная все еще будет находиться внутри определенного непрерывного блока виртуальной памяти и относительное положение полей не изменится вообще.Смежные массивы по-прежнему будут смежными с использованием ASLR: они просто начнутся с другой позиции в памяти.
Поскольку поля struct
по умолчанию являются смежными в памяти (и следуют их порядку объявления), это означает, что переполнение буфера все еще будет потенциальной проблемой , даже при использовании ASLR.