1 Windows内核版本
微软从windows Vista开始使用ASLR技术,进一步加强系统安全性,Vista之前的Server 2003、XP、2000都是5.x版本的。
2.ASLR
ASLR(地址空间布局随机化)是一种针对缓冲区溢出的安全保护技术。PE文件每次加载到内存的起始地址都会随机变化,堆栈的起始地址也会变化,即,每次加载到内存的实际地址都不同,采用ASLR技术增加恶意用户编写漏洞利用代码的难度,可以降低利用OS安全漏洞破坏系统的风险。
3.Visual C++
用Visual C++并不是都自动应用ASLR技术,一般在编译的时候默认开启了VC++的/DYNAMICBASE选项,如图:
不需要可以选择NO
4.ASLR.exe
用一个例子ASLR.cpp文件,来对比一下开启了ASLR和没开启ASLR的区别:
#include<stdio.h>
void main(){
printf("ASLR test program...\n");
}
分别用开启ASLR的编译和未开启ASLR的编译生成ASLR.exe和ASLR_no.exe;分别用OD打开看地址:
ASLR.exe
ASLR_no.exe
可以看到开启了ASLR的程序地址起始位置是随机的,而且很大,未开启的一般默认的ImageBase00400000开始,DLL文件的ImageBase为1000000
5.节区信息
“.reloc”的节区
可以看出ASLR.exe比ASLR_no.exe多出来了一个”.reloc”的节区,开启了ASLR的程序才会有这个节区,他不是程序运行所必需的,可以将其从PE文件中删除(DLL总是需要重定位,DLL文件中不可以删除),最重要的部分是IMAGE_FILE_HEADER\Characteristics与IMAGE_OPTIONAL_HEADER\DLL Characteristics这两个字段。
6.IMAGE_FILE_HEADER\Characteristics
对于ASLR.exe文件,在IMAGE_FILE_HEADER的Characteristics属性字段中不存在IMAGE_FILE_RELOCS_STRIPPED标志(由于ASLR,exe多了“.reloc”节区,所以Number Of Sections值增1)
7.IMAGE_OPTIONAL_HEADER\DLL Characteristics
上方为ASLR.exe文件,下方为ASLR_no.exe文件,ASLR.exe文件的IMAGE_OPTIONAL_HEADER\DLL Characteristics中设有IMAGE_CHARACTERISTICS_DYNAMIC_BASE标志,若VC++中开启了/DYNAMICBASE选项编译程序文件时就会设置上标志值
8.删除ASLR功能
使用二进制修改工具(这里用010Editor)将ASLR.exe文件的IMAGE_OPTIONAL_HEADER\DLL Characteristics中的IMAGE_CHARACTERISTICS_DYNAMIC_BASE标志删除就可删除ASLR标志,将原来的8140改为8100(偏移位于14E处),如图:
保存完之后再用OD打开看一下是不是有随即地址:
显然没有了。
其实还可以从可执行文件中删除“.reloc”节区,但是自己亲试了一下,改完之后,程序不能像之前运行,暂且先缓一缓!