- ASLR是一种针对缓冲区溢出的安全保护技术,从WIndows Vista开始采用该技术。
- 借助ASLR技术,PE文件每次加载到内存的起始地址都会随机变化,并且每次运行程序时相应进程的栈以及堆的起始地址也会随机改变。
- 一般使用MS Visual C++ 2010创建可执行文件(PE)时,EXE文件的ImageBase默认为00400000,DLL文件的ImageBase为10000000,但编译它们,如果默认开启了VC++的/DYNAMICBASE选项,那么ASLR技术就会应用到编译的文件中。
- ASLR.exe
#include "studio.h"
void main()
{
printf("ASLR test program...\n");
}
- 然后打开VC++的/DYNAMICBASE选项,编译得到ASLR.exe程序;再关闭/DYNAMICBASE:NO选项,编译得到ASLR_no.exe程序。
- 分别使用OllyDbg调试ASLR.exe与ASLR_no.exe程序,查看EP代码地址与栈地址。


- 使用PEView查看两个可执行文件。

- 左侧为ASLR.exe文件,右侧为ASLR_no.exe文件,可用清楚看到ASLR.exe文件比ASLR_no.exe文件多出1个名为“.reloc”的节区,一般而言,普通的EXE文件中是不存在.reloc节区的,该节区仅在应用了ASLR技术的文件中才会出现,它是编译时由编译器生成并保留再可执行文件中的。
- PE文件被加载到内存时,该节区被用作重定位的参考,它不是EXE文件运行的必须部分,可将其从PE文件中删除,但是由于DLL文件总是需要重定位,所以再DLL文件中不可将其删除。
IMAGE_FILE_HEADER\Characteristics
- 对于拥有.reloc节区的ASLR.exe文件来说,IMAGE_FILE_HEADER的Characteristics属性字段中并不存在IMAGE_FILE_RELOCS_STRIPPED(从文件中删除重新定位信息)标志。
- 由于ASLR.exe文件中多出1个.reloc节区,所以Number of Sections值增1.

IMAGE_OPTIONAL_HEADER\DLL Characteristics
- ASLR.exe文件的IMAGE_OPTIONAL_HEADER\DLL Characteristics中设有IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE标志,若VC++中开启/DYNAMICBASE选项,编译程序文件时就会设置上该标志值。

删除ASLR功能
- IMAGE_OPTINAL_HEADER\DLL Characteristics中设有IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE标志,删除它即可删除ASLR功能。
- 只需要将该标志删除即将8140改为8100.

- 保存后使用OllyDbg调试。

- 可用看到以及成功删除ASLR功能。