ASLR技术会使PE文件每次加载到内存的起始地址随机变化,并且进程的栈和堆的起始地址也会随机改变。微软从windows vista/windows server 2008(kernel version 6.0)开始采用ASLR技术,主要目的是为了防止缓冲区溢出。
该技术需要操作系统和编译工具的双重支持(主要是操作系统的支持,编译工具主要作用是生成支持ASLR的PE格式)。
我们这里要动手关闭aslr,可以修改IMAGE_OPTIONAL_HEADER的DLL Characteristics字段,下面是DLL Characteristics的属性值,相或代表属性叠加。
#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // DLL can move. ASLR
#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080 // Code Integrity Image
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // Image is NX compatible DEP
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 // Image understands isolation and doesn't want it
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 // Image does not use SEH. No SE handler may reside in this image
#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 // Do not bind this image. // 0x1000 // Reserved.
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 // Driver uses WDM model // 0x4000 // Reserved.
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
将8140改为8100,也就是让DLL不能move,ASLR就被关掉了。
也可以通过修改注册表的方式取消系统的ASLR功能。该功能是一个安全选项,无特殊需要不建议关闭。
win+r,输入regedit,打开注册表,新建注册表项
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session
Manager\Memory Management] “MoveImages”=dword:00000000
就可关闭ASLR。
删除该键值项,就可以开启ASLR功能。
通过注册表修改ASLR需要重启机器。
参考:
https://blog.youkuaiyun.com/weixin_43742894/article/details/105702886
https://blog.youkuaiyun.com/m0_37809075/article/details/83041090