ASLR内存随机化保护机制

1.映像随机化

映像随机化是在 PE 文件映射到内存时,对其加载的虚拟地址进行随机化处理,这个地址是在系统启动时确定的,系统重启后这个地址会变化。

可能是出于兼容性的考虑,微软在系统中设置了映像随机化的开关,用户可以通过设置注册表 中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session M anager\MemoryManagement\MoveImages 的键值来设定映像随机化的工作模式。

  • 设置为 0 时映像随机化将禁用。
  • 设 置 为 −1 时 强 制 对 可 随 机 化 的 映 像 进 行 处 理 , 无 论 是 否 设 置 IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 标识。
  • 设置为其他值时为正常工作模式,只对具有随机化处理标识的映像进行处理。

如果注册表中不存在 MoveImages,大家可以手工建立名称为 MoveImages,类型为 DWORD的值,并根据需要设置它的值。

2.堆栈随机化

这项措施是在程序运行时随机的选择堆栈的基址,与映像基址随机化不同的是堆栈的基址不是在系统启动的时候确定的,而是在打开程序的时候确定的,也就是说同一个程序任意两次运行时的堆栈基址都是不同的,进而各变量在内存中的位置也就是不确定的。

3.PEB 与 TEB 随机化

PEB 与 TEB 随机化在 Windows XP SP2 中就已经引入了,微软在 XP SP2 之后不再使用固定的 PEB 基址 0x7FFDF000 和 TEB 基址 0x7FFDE000,而是使用具有一定随机性的基址,这就增加了攻击 PEB 中的函数指针的难度。

ASLR 的出现使得 shellcode 中的关键跳转只能在系统重启前,甚至只有程序的本次运行时才能执行,这使得 exploit 的难度大大增加。