原理
前面所有漏洞利用方法都有着一个共同的特征:都需要确定一个明确的跳转地址。无论是 JMP E SP 等通用跳板指令还是 Ret2Libc 使用的各指令,我们都要先确定这条指令的入口点。
微软的 ASLR( Address Space Layout Randomization)技术就是通过加载程序的时候不再使用固定的基址加载,从而干扰shellcode 定位的一种保护机制。
支持 ASLR 的程序在它的 PE 头中会设置 IMAGE_DLL_CHARACTERISTICS_ DYNAMIC_BASE 标识来说明其支持 ASLR。微软从 Visual Studio 2005 SP1 开始加入了/dynamicbase 链接选项来帮我们完成这个任务,我们只需要在编译程序的时候启用/dynmicbase 链接选项,编译好的程序就支持 ASLR了。
映像随机化
映像随机化是在 PE 文件映射到内存时,对其加载的虚拟地址进行随机化处理,这个地址是在系统启动时确定的,系统重启后这个地址会变化。
可能是出于兼容性的考虑,微软在系统中设置了映像随机化的开关,用户可以通过设置注册表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages 的键值来设定映像随机化的工作模式。
1.设置为 0 时映像随机化将禁用。
2.设置 为 −1 时 强 制 对 可随 机 化 的 映像 进 行 处 理 , 无 论 是 否设 置IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 标识。
3.设置为其他值时为正常工作模式,只对具有随机化处理标识的映像进行处理。
如果注册表中不存在 MoveImages,大家可以手工建立名称为MoveImages,类型为DWORD的值,并根据需要设置它的值。
堆栈随机化
同一个程序任意两次运行时的堆栈基址都是不同的,进而各变量在内存中的位置也就是不确定的。
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(int argc, char* argv[])
{
char *heap = (char*)malloc(100);
char stack