Почему ASLR не выключается для значений из кучи?
Скажем, я хочу отладить структуру данных и для простоты хочу иметь одинаковые адреса в памяти. Очевидно, что для этого нужно отключить ASLR. Потому поступаю как в этом ответе.
Процесс запускается от администратора. В ProcessHacker в этом процессе вижу, что ASLR выключен.
Вот пример программы:
#include<iostream>
struct Node {
int Data;
Node* next;
};
Node* add(Node* head, int Value)
{
Node* New = new Node;
New->Data = Value;
New->next = head;
return New;
}
void Show(Node* head)
{
while (head)
{
printf("%p \n", head);
head = head->next;
}
printf("Adress of show func %p\n", &Show);
while (1);
}
int main()
{
Node* a = nullptr;
for (int i = 0; i < 5; i++)
a = add(a, i);
Show(a);
}
Первый запуск программы:
005AED48
005A5538
005A5500
005A5680
005A5648
Adress of show func 00411447
Второй запуск:
006E5538
006E5500
006E5680
006E5648
006E05A0
Adress of show func 00411447
Почему адреса значений из кучи всё ещё рандомизируются? Я хочу, чтобы они повторялись от запуска к запуску
Ответы (2 шт):
Действителльно, @user7860670 прав. Куча всегда рандомизирована и отключение ASLR повлиять на это не может. В этом ответе сказано:
Heaps and some other strucutres are randomized always.
Говорят, что на линуксе помогает echo 0 | sudo tee /proc/sys/kernel/randomize_va_space.