如何在 Windows PE 二进制文件中启用 ASLR?

Ian*_*oyd 3 aslr

如何启用可执行文件的地址空间布局随机化?

注意:我没有使用 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)
Run Code Online (Sandbox Code Playgroud)

如何启用地址空间布局随机化?它是PE标志吗?它是组装清单条目吗?

奖金

我如何选择一个可执行文件进入 NX(不执行)?

Ian*_*oyd 5

该解决方案是该选项嵌入在PE二进制标头。但是,而不是

loadedImage.FileHeader.FileHeader.Characteristics
Run Code Online (Sandbox Code Playgroud)

在里面:

loadedImage.FileHeader.OptionalHeader.DllCharacteristics
Run Code Online (Sandbox Code Playgroud)

你在哪里设置标志:

IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040; //The DLL can be relocated at load time.
Run Code Online (Sandbox Code Playgroud)

对于辅助函数伪代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后打电话

//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);
Run Code Online (Sandbox Code Playgroud)