Рандомизация разметки адресного пространства в компиляторах C

Если я не ошибаюсь, ASLR будет заставлять локальные переменные в компиляторах C иметь другой адрес каждый раз, когда я запускаю программу. Но когда я попробовал его в Turbo C ++ и Dev-CPP IDE, он просто вернул аналогичный адрес для локальных переменных. Код, который я пробовал:

#include <stdio.h>
#include <conio.h>

int main()
{
 int x = 10;
 int *ptr = &x;
 printf("%d", ptr);
 getch();
 return 0;
}

Раньше я думал, что адреса локальных переменных одинаковы, потому что они размещены в той же области стека и, следовательно, в том же адресе памяти. Но когда я нашел здесь, в stackoverflow, тему об ASLR, это заставило меня сделать это. Думаю, это из-за компиляторов. Может ли кто-нибудь пролить свет на это?

Изменить:

Я использую Windows 7.


person paulj    schedule 04.08.2014    source источник
comment
Не используйте %d для печати указателей. %d только когда-либо подходит для печати ints. Вместо этого используйте %p и явное приведение к void *: printf("%p", (void *)ptr);   -  person The Paramagnetic Croissant    schedule 04.08.2014
comment
Возможно, рассматриваете возможность использования современного компилятора? Turbo C ++ не обновлялся почти десять лет ...   -  person Nik Bougalis    schedule 04.08.2014
comment
@NikBougalis Я это сказал, я тоже использовал dev cpp.   -  person paulj    schedule 04.08.2014
comment
@TheParamintageCroissant Я попробую.   -  person paulj    schedule 04.08.2014
comment
@TheParamintageCroissant Результат аналогичен. Только в HEX.   -  person paulj    schedule 04.08.2014
comment
@PaulJabines Возможно, результат похож, но печать указателя с %d является неопределенным поведением.   -  person The Paramagnetic Croissant    schedule 04.08.2014


Ответы (2)


Похоже, вы используете окна.

Цитата из википедии

В Windows Vista от Microsoft (выпущенной в январе 2007 г.) и более поздних версиях ASLR включен только для тех исполняемых файлов и библиотек динамической компоновки, которые специально связаны с поддержкой ASLR. Для совместимости он по умолчанию не включен для других приложений. Обычно несовместимо только старое программное обеспечение, и ASLR можно полностью включить, отредактировав запись реестра «HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Memory Management \ MoveImages».

и

Хост-системы предотвращения вторжений, такие как WehnTrust и Ozone, также предлагают ASLR для операционных систем Windows XP и Windows Server 2003. WehnTrust имеет открытый исходный код Полная информация о реализации Ozone недоступна

Убедитесь, что вы включили ASLR для соблюдения ожидаемого поведения.

person Mohit Jain    schedule 04.08.2014
comment
Спасибо за ответ. так что ASLR можно включить / отключить. - person paulj; 04.08.2014
comment
Да, вам нужно включить его, используя один из методов, описанных в кавычках, или следуя методу, описанному @nix - person Mohit Jain; 04.08.2014

Есть несколько вещей, которые могут повлиять на то, использует ли ваша программа ASLR или нет. В большинстве случаев вашему компилятору / компоновщику необходимо обеспечить возможность перемещения исполняемого файла и пометить исполняемый файл как совместимый с ASLR. Затем ваша ОС должна фактически переместить ее во время загрузки.

Поддерживают ли ваши компиляторы ASLR? Если нет, и вы используете Windows (я предполагаю, что вы основаны на компиляторах, которые вы используете), вы можете попытаться заставить ОС применять ASLR с помощью EMET, который вы можете загрузить с сайта Microsoft.

person user3553031    schedule 04.08.2014