Как включить ASLR в двоичном файле Windows PE?

Как включить рандомизацию адресного пространства исполняемого файла?

Примечание: я не использую Visual Studio или какой-либо компилятор, который предоставляет параметр компилятора /dynamicbase.

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

Другие флаги PE

Есть и другие параметры исполняемого образа Windows, которые я уже знаю, как установить. Например, тогда IMAGE_FILE_NET_RUN_FROM_SWAP флаг. Вы устанавливаете опцию PE в двоичном заголовке PE:

LOADED_IMAGE li;
MapAndLoad(fileName), null, li, false, false)

LI.FileHeader.FileHeader.Characteristics |= IMAGE_FILE_NET_RUN_FROM_SWAP;

UnMapAndLoad(li)

Как включить рандомизацию разметки адресного пространства? Это флаги PE? Это запись манифеста сборки?

Бонус

Как выбрать исполняемый файл в NX (без выполнения)?


person Ian Boyd    schedule 25.09.2013    source источник


Ответы (1)


Решение состоит в том, что параметр встроен в двоичный заголовок PE. Но скорее чем

loadedImage.FileHeader.FileHeader.Characteristics

it's in:

loadedImage.FileHeader.OptionalHeader.DllCharacteristics

Где вы устанавливаете флаг:

IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040; //The DLL can be relocated at load time.

Для псевдокода вспомогательной функции:

void SetPEOptFlags(String filename, UInt32 flags)
{
   // Any code is released into the public domain. No attribution required.
   LOADED_IMAGE li;
   MapAndLoad(filename, null, li, false, false);
  
   li.FileHeader.OptionalHeader.DllCharacteristics |= flags;
   UnMapAndLoad(li);
}

а затем позвонив

//Optional dll characteristics
const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040; //The DLL can be relocated at load time.
const IMAGE_DLLCHARACTERISTICS_NX_COMPAT =    0x0100; //The image is compatible with data execution prevention (DEP).


SetPEOptFlags("C:\Foo\Contoso.exe", 
   IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT);
person Ian Boyd    schedule 25.09.2013