开启和关闭ASLR

  1. 前言
  2. ASLR的由来
  3. 开启了ASLR和没开之间的区别
  4. 参考链接

前言

昨天在分析样本的时候提到了ASLR,特地去了解了一下。记录一下

ASLR的由来

微软从windows vista/windows server 2008(kernel version 6.0)开始采用ASLR技术,主要目的是为了防止缓冲区溢出
ASLR技术会使PE文件每次加载到内存的起始地址随机变化,并且进程的栈和堆的起始地址也会随机改变。
该技术需要操作系统和编译工具的双重支持(主要是操作系统的支持,编译工具主要作用是生成支持ASLR的PE格式)
若不想使用ASLR功能,可以在VS编译的时候将“配置属性->链接器->高级->随机基址”的值修改为否即可

开启了ASLR和没开之间的区别

开启了ASLR的PE段多出一个.reloc,没开启ASLR没有.reloc这个段

IMAGE_FILE_HEADER\Characteristics
开启了ASLR的比没开启ASLR的少了一个IMAGE_FILE_RELOCS_STRRIPED
该字段的含义

重新定位信息被从文件中剥离。文件必须在它的首选基地址加载。如果基地址不可用,加载程序将报告错误。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v = vs.85).aspx

IMAGE_OPTIONAL_HEADER\DllCharacteristics
开启ASLR的程序比未开启的DllCharactersitics多了一个字段IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,该字段值的含义
可以在加载时重新定位DLL

删除PE文件的ASLR功能
将IMAGE_OPTIONAL_HEADER\DllCharacteristic中的IMAGE_DLLCHARACTERISTICS_DYNAMIC字段值去掉即可:将PE中的十六进制第一个40 81数据改为00 81

修改完在去看,发现IMAGE_DLLCHARACTERISTICS_DYNAMIC字段已经被删除

调试中的不同,无ASLR或关闭了ASLR是可以成功对应IDA的地址在OD中找到的

开启了ASLR后入口点和地址被随机化,无法定位

x64关闭ASLR
x64关闭PE的ASLR尝试寻找对应的十六进制发现找不到对应介绍的文章
后面发现可以用CFF Explore来关闭
64位

在编辑可选PE头的DllCharacteristics,点击Click here,将第一个复选框dll can move 去除勾选即可。改完以后Save

关闭ASLR后

关闭ASLR,从系统层面修改注册表;从PE文件中即修改相关字段值。
在调试程序的时候,因为地址随机化,每次调试地址都不一样,很是影响调试效果。关闭后文件总是加载到以400000为基址的地址范围内,代码的地址和IDA中也一直,所以大大方便分析。

参考链接

修改PE可选头关闭ASLR
关闭地址随机化ASLR


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:开启和关闭ASLR

本文作者:九世

发布时间:2020-12-19, 21:07:08

最后更新:2020-12-19, 21:43:45

原始链接:http://422926799.github.io/posts/2a9e327.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录