微软从windows vista/windows server 2008(kernel version 6.0)开始采用ASLR技术,主要目的是为了防止缓冲区溢出ASLR技术会使PE文件每次加载到内存的起始地址随机变化,并且进程的栈和堆的起始地址也会随机改变。
ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、MacOS、Windows等主流操作系统都已采用了该技术。
一、主要特点
1、映像随机化
经典的方法是用注册表项HKLM\SYSTEM\CurrentControlSet\Session Manager\Memory Management的方法对映像随机化禁用 设置为0 禁用 ,-1强制对可随机化的映像进行处理,其他值正常工作;
各模块的低位2位不变;
只是对加载基址的前2个字节做了随机处理;
2、堆栈随机化
XP下不具备,VISTA具备,每次获取堆地址不同;不需要精确跳转的,溢出手段影响有限;
3、PEB TEB随机化
XP SP2中已经引入了,使用随机性的基址。
提取代码:
unsigned int teb;
unsigned int peb;
__asm
{
mov eax,fs:[0x18]
mov teb,eax
mov eax,dword ptr [eax+0x30
mov teb,eax]
}
printf("PEB:%#x\nTEB:%#x",peb,teb);
getchar();
4、VS2019中支持ASLR
该技术需要操作系统和编译工具的双重支持(主要是操作系统的支持,编译工具主要作用是生成支持ASLR的PE格式); 若不想使用ASLR功能,可以在VS(2019)编译的时候将“配置属性->链接器->高级->随机基址”的值修改为否即可。
5、工具鉴别
这里我们用一个工具ASLRProcessScanner来查看下ASLR是否打开,
发现这个程序是打开了ASLR。
这个程序有如下的用法,
可以批量指出当前运行的进程有哪些具备ASLR,也可以对指定进程、程序进行检测。
二、比对PE信息
准备两个PE程序,一个有ASLR,一个没有 ASLR,用PEView查看,
ASLR.exe比NoASLR.exe多了一个.reloc节区,这个节区存储了程序中的硬编码信息。
IMAGE_FILE_HEADER\Characteristics
发现ASLR.exe比NoASLR.exe少了一个“IMAGE_FILE_RELOCS_STRRIPED(0001)”标志,该标志的含义是:
Relocation information was strippedfrom the file. The file must be loaded at its preferred base address. If the base address is not available, the loader reports an error.
换个工具看下,
ASLR.exe位置的数值为 0,而NoASLR.exe位置的数值为 1;也就意味着这里我只要置为 1 就可关闭ASLR;
三、关闭ASLR,便于调试
ASLR技术会使PE文件每次加载到内存的起始地址随机变化,并且进程的栈和堆的起始地址也会随机改变。
该技术需要操作系统和编译工具的双重支持(主要是操作系统的支持,编译工具主要作用是生成支持ASLR的PE格式)。
1、关闭操作系统的ASLR
操作系统方面关闭ASLR支持,不知道在哪里关闭怎么办呢?没关系,我们可以看看别人是怎么做的。
可以看到注册表添加了一个DWORDRD键值项HKLM\System\CurrentControlSet\Control\SESSION MANAGER\MEMORY MANAGEMENT\MoveImages,其值为0。
2、关闭PE头中ASLR
那么这个时候我们可以通过修改PE头中可选头的Characteristics来达成我们的目的。
将这个0x0103改成0x0102就可以关闭PE中的ASLR了。
3、这样每次加载的时候都是在同一个地址,调试起来的时候是固定地址了。用OD逆向的时候,和IDA中的地址对上了。
至此,简单介绍完毕。
这是我的第100篇文章,非常有纪念意义!
同时,这篇文章居然是在“魔都”完成的,没想到的缘份;今天也是这个公众号开办整整9个月,一切都值得纪念。