第41章 ASLR
本文最后更新于:2022年5月27日 下午
第41章 ASLR
ASLR (Address Space Layout Randomization,地址空间布局随机化)是一种针对缓冲区溢岀的安全保护技术,微软从Windows Vista开始采用该技术,本章将学习其相关知识。
41.1 Windows内核版本
表41 -1中列出了各Windows OS采用的内核版本。
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 |
微软从Windows Vista开始升级采用新的Major Kernel Version 6 (Major版本号从5升级为6约用了7年)。微软从Windows Vista (Kernel Version 6)开始采用ASLR技术,以进一步加强系统安全性。
41.2 ASLR
借助ASLR技术,PE文件每次加载到内存的起始地址都会随机变化,并且每次运行程序时相应进程的栈以及堆的起始地址也会随机改变。也就是说,每次EXE文件运行时加载到进程内存的实际地址都不同,最初加载DLL文件时装载到内存中的实际地址也是不同的。
微软改用这种方式加载PE文件的原因何在呢?是为了增加系统安全性。大部分Windows OS安全漏洞(一般为缓冲区溢岀)只岀现在特定OS、特定模块、特定版本中。以这些漏洞为目标的漏洞利用代码(exploit code)中,特定内存地址以硬编码形式编人(因为在以前的OS中,根据OS版本的不同,特定DLL总是会加载到固定地址)。因此,微软采用了这种ASLR技术,增加了恶意用户编写漏洞利用代码的难度,从而降低了利用OS安全漏洞破坏系统的风险(UNIX/Linux OS等都已采用了ASLR技术)。
41.3 Visual C++
请注意,并不是所有可执行文件都自动应用ASLR技术。如上所述,OS的内核版本必须为6以上,并且使用的编程工具(如:VC++)要支持/DYNAMICBASE选项。
一般使用MS Visual C++ 2010创建可执行文件(PE)时,EXE文件的ImageBase默认为00400000,DLL文件的ImageBase为10000000。但编译它们时,如果默认开启了 VC++的/DYNAMICBASE选项,那么ASLR技术就会如图41-1所示应用到编译的文件中。
若不想应用ASLR技术,只需将“随机基址”选项改为“/DYNAMICBASE:NO” 即可,如图41-2所示。
41.4 ASLR.exe
本示例程序使用的所有源代码由MS Visual C++2010 Express Edition开发而成,在Windows 7 32位环境中通过测试。
为了测试ASLR技术,我们首先编写一个简单的基于控制台的程序,程序源代码如下所示。
然后打开VC++的/DYNAMICBASE选项,编译得到ASLR.exe程序;再关闭/DYNAMICBASE:NO选项,编译得到ASLR_no.exe程序。接下来使用调试器分别调试。
图41-3是使用OllyDbg调试ASLR.exe的画面,请认真查看EP代码地址与栈地址(如果使用的操作系统是VISTA以上版本的,那么每次运行时地址都会随机变化)。
图41-4是使用OllyDbg调试ASLR_no.exe的画面,EP代码地址与栈地址未变化,就像在XP系统中看到的一样。下面使用PEView工具查看并比较它们。
1 |
|
41.4.1节区信息
图41 -5左侧为ASLR.exe文件,右侧为ASLR_no.exe文件。可以清楚看到ASLR.exe文件比ASLR_no.exe文件多岀1个名为“.reloc”的节区。一般而言,普通的EXE文件中是不存在.reloc节区的,该节区仅在应用了ASLR技术的文件中才会出现,它是编译时由编译器生成并保留在可执行文件中的。PE文件被加载到内存时,该节区被用做重定位的参考,它不是EXE文件运行的必需部分,可将其从PE文件中删除(但是由于DLL文件总是需要重定位,所以在DLL文件中不可将其删除)。最重要的部分是IMAGE_FILE_HEADER\Characteristics与IMAGE_OPTIONAL_HEADER\DLL Characteristics这2个字段,下面分别予以说明。
41.4.2 IMAGE_FILE_HEADER\Characteristics
如图41-6所示,上方为ASLR.exe文件,下方为ASLR_no.exe文件。对于拥有.reloc节区的ASLR.exe文件来说,IMAGE_FILE_HEADER 的 Characteristics 属性字段中并不存在 IMAGE _FILE_RELOCS_STRIPPED(l)标志(由于ASLR.exe文件中多岀 1 个.reloc节区,所以Number of Sections值增1)
41.4.3 IMAGE_OPTIONAL_HEADER\DLL Characteristics
图41-7中,上方为ASLR.exe文件,下方为ASLR_no.exe文件。ASLR.exe文件的IMAGE_OPTIONAL_HEADER\DLL Characteristics 中设有 IMAGE_DLL\CHARACTERISTICS_DYNAMIC_BASE(40)标志。若VC++中开启了/DYNAMICBASE选项,编译程序文件时就会设置上该标志值(参考图41-2)。
以上我们学习了PE文件头中添加的、与支持ASLR功能相关的信息。下面通过一个练习来学习如何操作这些信息。
41.5练习:删除ASLR功能
41.5.1删除ASLR功能
本练习示例中,我们将使用Hex Editor工具修改ASLR.exe文件,以此来删除ASLR功能。从图41-7中可以看到,IMAGE_OPTIONAL_HEADER\DLLCharacteristics中设IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(40)标志,删除它即可删除ASLR功能。在Hex Edtior中将DLL属性值由8140更改为8100 (位于136偏移处的WORD值,参考图41-7、图41-8)。
保存后在调试器中运行,如图41-9所示。
从图41-9中可以看到,已经成功删除ASLR功能。
当然,也可以通过修改PE文件头向文件中添加ASLR功能,但这样做没什么意义,所以一般都不会这么做3因为,向没有重定位节区(.reloc)的PE文件添加ASLR功能后,文件运行时可能会因不正确的内存引用而发生错误。
如果一个要详细分析的文件应用了ASLR功能,分析前可以暂时将ASLR功能删除,然后再调试分析,由于文件总是被加载到相同的内存地址,所以分析起来会更简便。