ASLR
一、ASLR是什么?
ASLR(Address Space Layout Randomization,地址空间布局随机化)是一种针对缓冲区溢出的安全保护技术。微软从Windows Vista(Kernel Version 6)开始采用该技术。
OS | 内核版本 |
---|---|
Windows 2000 | 5.0 |
Windows XP | 5.1 |
Windows Server 2003 | 5.2 |
Windows Vista | 6.0 |
Windows Server 2008 | 6.0 |
Windows Server 2008 R2 | 6.1 |
Windows 7 | 6.1 |
借助ASLR,PE文件每次加载到内存的起始地址都会随机变化,并且每次运行程序时相应进程的栈以及堆的起始地址也会随机改变。也就是说,每次EXE文件运行时加载到进程内存的实际地址都不同,最初加载DLL文件时装载到内存中的实际地址也是不同的。
微软采用这种方式加载PE文件是为了增加系统的安全性。大部分Windows OS安全漏洞(一般为缓冲区溢出)只出现在特定OS、特定模块、特定版本中。以这些漏洞为目标的漏洞利用代码(exploit code)中,特定内存地址以硬编码的形式编入(因为在以前的OS中,根据OS版本的不同,特定DLL总是会加载到固定地址)。 因此,微软采用了这种ASLR技术,增加了恶意用户编写漏洞利用代码的难度,从而降低了利用OS安全漏洞破坏系统的风险(UNIX/Linux OS等都已采用了ASLR技术)
二、测试ASLR技术
1.一个简单的源文件
#include <iostream>
void main()
{
printf("ASLR test program...\n");
}
2.生成ALSR.exe与ALSR_no.exe
采用/DYNAMICBASE编译生成ASLR.exe文件。
采用/DYNAMICBASE:NO编译生成ASLR_no.exe文件
3.使用OllDbg调试器查看程序入口地址与栈地址
对比发现ASLR.exe与ASLR_no.exe程序入口地址与堆栈地址不同。
3.1 ASLR.exe
程序执行完后:
注:以下图片均为重启计算机后所截的图。
3.2 ASLR_no.exe
程序执行完后:
4.使用CFF Explorer查看PE文件信息
4.1 重定位表的区别
ASLR多了一个重定位目录表,即多了一个.reloc节区。ASLR的NumberOfSection比ASLR_no的值大1。
一般而言,普通的EXE文件是不存在.reloc节区的,该节区仅在应用了ASLR技术的文件中才会出现,它是编译器生成并保留的在可执行文件中的。
PE文件被加载到内存时,该节区被用作重定位的参考,它不是EXE文件运行的必须部分,可将其从PE文件中删除。由于DLL文件总是需要重定位,所以DLL文件中不可将其删除。
4.2 IMAGE_FILE_HEADER/Characteristics属性
ASLR.exe中没有 relocation info stripped from file(IAMGE_FILE_RELOCS_STRIPPED(1))属性
4.3 IMAGE_OPTIONAL_HEADER/DLL Characteristics属性
ASLR.exe中设有 DLL can move(IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(40))属性,删除这个属性,即可删除ASLR功能。
5. 删除ASLR功能
修改ASLR.exe文件的可选PE头属性信息,将8140修改为8100(即把IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(40)属性删除)并另存为ASLR_DEL.exe文件。
再用OllDbg查看ASLR_DEL.exe程序的入口地址以及程序的堆栈地址。
发现程序入口地址变回来了,并没有随机化。
三、重启系统后,观察ASLR.exe映射到内存中的变化
重新启动计算机,再次用OllDbg查看ASLR.exe程序的入口地址与堆栈地址。发现重启系统后,程序入口地址与堆栈地址随机化了。
ASLR.exe:
采用地址空间随机化
用OllDbg调试发现程序入口地址为AA1343H
重新启动计算机后:
用OllDbg调试发现程序入口地址为201343H
ASLR_no.exe:
不使用地址空间随机化
用OllDbg调试发现程序入口地址为411343H
ASLR_DEL.exe:
把ASLR.exe取消了地址随机化
用OllDbg调试发现程序入口地址为411343H
总结
1、ASLR 机制在每次引导的时候为一个给定的DLL选择一个同样的基地址。但是当系统进行重启后,加载基址就会变化,也就是说可以认为这里的地址随机化在系统启动的时候就进行重定位,此后在此系统中,系统dll在每个进程中的基址相同。
2、如果一个要详细分析的文件应用了ASLR功能,分析前可以暂时将ASLR功能删除,然后再调试分析,由于文件总是被加载到相同的内存地址,所以分析起来会更简便。