Куча рандомизации в винде
Windows 7 имеет функции рандомизации кучи и рандомизации стека. Как я мог справиться с этим? Как они влияют на производительность моего приложения? Где я мог найти больше информации о том, как это работает?
Я использую Visual Studio 2008 для разработки программ на C++. Я не могу найти параметры компилятора для этих функций.
2 ответа
Хорошо, рандомизация кучи и рандомизация стека являются функциями Windows, но должны быть явно включены для каждого процесса во время соединения. Марк Руссинович описал, как это работает, в своей 5-й книге Windows Internals.
Рандомизация стека состоит в том, чтобы сначала выбрать одно из 32 возможных положений стека, разделенных либо 64 КБ, либо 256 КБ. Этот базовый адрес выбирается путем нахождения первой подходящей свободной области памяти и затем выбора x- й доступной области, где x снова генерируется на основе TSC текущего процессора, смещенного и замаскированного в 5-битное значение. <...>
Наконец, ASLR рандомизирует расположение начальной кучи процесса (и последующих кучи) при создании в пользовательском режиме. Функция RtlCreateHeap использует другое псевдослучайное значение, полученное из TSC, для определения базового адреса кучи. Это значение, на этот раз 5 битов, умножается на 64 КБ для генерации конечного базового адреса, начиная с 0, давая возможный диапазон от 0x00000000 до 0x001F0000 для начальной кучи. Кроме того, диапазон перед базовым адресом кучи освобождается вручную в попытке форсировать нарушение доступа, если атака выполняет перебор всего возможного диапазона адресов кучи.
Конечно, это просто функция ОС? Это не должно вас беспокоить. ОС будет перемещать ваше приложение, и если вы не предполагаете, что ваше приложение загружено по определенному адресу памяти (который вы никогда не должны предполагать), у вас не возникнет никаких проблем.