简述
ASLR(Address Space Layout Randmoization,地址空间布局随机化)是一种针对于缓冲区溢出的安全保护技术。
windows 内核版本
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技术,以进一步加强系统安全性
ASLR
借助ASLR技术,PE文件每次加载到内存的起始地址都会随机变化,并且每次运行程序时相应进程的栈以及堆的起始地址也会随机变化。即每次EXE文件运行时加载到进程内存的实际地址都不同,最初加载DLL文件时装载到内存中的实际地址也是不同的
微软改用这种方式加载PE文件的原因何在呢?是为了增加系统安全性。大部分windows OS 安全漏洞(一般为缓冲区溢出)只出现在特定的OS,特定模块,特定版本中。以这些漏洞为目标的漏洞实利用代码(exploit code),特定内存地址以硬编码形式编入(因为在以前的OS中,根据OS版本不同,特定的DLL总会加载到固定的地址)。因此,微软采用了这种ASLR技术,增加了恶意用户编写漏洞利用代码的难度,从而降低了利用OS安全漏洞破坏系统的风险(UNIX/Lunix OS等都已采用了ASLR技术)
visual c++
请注意,并不是所有的可执行文件都自动应用了ASLR
技术。如上所述,OS的内核版本必须为6以上,并且使用的编程工具得支持/DYNAMICBASE
选项,一般使用VS创建可执行程序时,Exe 的Imagebase默认为0x400000,dll文件的Imagebase默认为0x10000000,但如果编译它们的时候,如果默认开启了/DYNAMICBASE
选项,那么ASLR技术就会被应用到编译的文件之中
若不想应用ASLR技术,只需将“随机基址”选项改为“/AYNAMICBASE:NO
”即可,如下图
ASLR.exe
采用了ASLR技术的EXE:
第一次载入OD:
第二次载入OD:
未采用了ASLR技术的EXE:
第一次载入OD:
第二次载入OD:
总结:
采用了ASLR技术生成的exe,如果使用的操作系统是VISTA以上版本的,那么每次运行时地址都会随机变化。如果为采用ASLR技术生成的exe,EP代码地址与栈地址未变化,就像在XP系统看到的系统
节区信息
左侧为采用ASLR技术的exe程序,右侧为未采用ASLR技术的exe程序,可以清楚地看到左侧多出1个名为“.reloc”的节区。
一般而言,普通的exe程序中是不存在.reloc节区的,该节区仅在应用了ASLR技术中的程序才会出现,它是在编译时由编译器生成并保留在可执行文件中的。PE文件被加载到程序时,该节区被用作重定位的参考,它不是exe程序的运行的必需部分,可将其从PE文件中删除(但是由于DLL文件中总是需要重定位,所以在DLL文件中不可将其删除)。最重要的部分是IMAGE_FILE_HEADER\Characteristics
与IMAGE_OPTIONAL_HEADER\DLL_Characteristics
这2个字段
IMAGE_FILE_HEADER\Characteristics
各位看加载的名字都能看出哪一个是采用了ASLR技术,哪一个是未采用ASLR技术。对于拥有.reloc节区的ASLR.exe程序来说,IMAGE_FILE_HEADER\Characteristics
属性字段并不存在IMAGE_FILE_RELOCS_STARIPPED(1)
标志(由于ASLR.exe程序中多出一个.reloc节区,所以Number of Sections
值增1)
IMAGE_OPTIONAL_HEADER\DLL_Characteristics
ASLR.exe程序的IMAGE_OPTIONAL_HEADER\DLL_Characteristics
中设有IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(40)
若VS中开启了/DYNAMICBASE
选项,编译程序文件时就会设置上该标志值
删除ASLR功能
我们使用hex Editor工具修改ASLR.exe程序,以此来删除ASLR功能,从上可知,IMAGE_OPTIONAL_HEADER\DLL_Characteristics
中设有IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(40)
标志,删除它即可删除ASLR功能。即在hex editor中将DLL属性值由8140改成8100(位于146偏移处的WORD值)
修改后:(这里我用CFF
修改的)
把ASLR_edit
拖进OD尝试一下,gogogo
第一次载入OD:
第二次载入OD:
好家伙,成功了,普天同庆!!!!
补充
当然,也可以通过修改PE文件头向文件中添加ASLR功能,但这样做没有什么意义,所以一般都不会这么做,因为,向没有重定位节区(.reloc)的PE文件添加ASLR功能后,文件运行时可能会因为不正确的内存引用而发生错误。
如果一个要详细分析的文件应用了ASLR功能,分析前可以暂时将ASLR功能删除,然后再调试分析,由于文件总是被加载到相同的内存地址,所以分析起来会比较方便。