地址空间布局随机化(ASLR)

作者:{Biubiubiu2}@ArkTeam

ASLR(Address Space Layout Randomization,地址空间布局随机化)是一种针对缓冲区溢出的安全保护技术。借助ASLRPE文件每次加载到内存的起始地址都会随机变化。目前大部分主流操作系统都已经实现了ASLR,如Windows VistaLinux 2.6.12Mac OS X 10.7iOS 4.3以及Android 4.0均从此版本开始支持ASLR

微软采用这种方式的目的是想要增加系统的安全性。在经典的栈溢出模型中,攻击者可以通过覆盖函数的返回地址,以达到控制程序执行流程的目的。通常将返回地址覆盖为0x7FFA4512 ,即JMP ESP指令。如果此时ESP刚好指向栈上布置的Shellcode,则Shellcode被执行。


1 栈溢出模型

在以此类漏洞为目标的漏洞利用代码(Exploit code)中,必须确定一个明确的跳转地址,并以硬编码形式编入。在Vista之前的操作系统里,DLL会加载到固定地址,例如,在Win32系统中EXE文件的ImageBase默认为0x00400000DLL文件为0x10000000ASLR的加入,使得加载程序的时候不再使用固定的基址,从而干扰Shellcode定位。

ASLR需要操作系统和程序自身的双重支持,操作系统方面从Windows Vista开始采用该技术,编译器上于Visual Studio 2005 SP1加入/dynamicbase链接选项支持随机基址:


图2 VS编译选项

在支持ASLRPE文件中,会多出两个“.reloc”节区以及“IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE”的标志。


图3 PE文件

ASLR虽然增加了编写恶意代码的难度,但是仍存在很多绕过方式,如攻击未启用ASLR的模块、堆喷射(HeapSpray)、覆盖部分返回地址、Java applet heap spray等。因此,想要真正防御缓冲区溢出,还需要综合使用多种安全保护技术。

发表评论

电子邮件地址不会被公开。 必填项已用*标注