ASLR


一、ASLR是什么?

ASLR(Address Space Layout Randomization,地址空间布局随机化)是一种针对缓冲区溢出的安全保护技术。微软从Windows Vista(Kernel Version 6)开始采用该技术。

OS内核版本
Windows 20005.0
Windows XP5.1
Windows Server 20035.2
Windows Vista6.0
Windows Server 20086.0
Windows Server 2008 R26.1
Windows 76.1

借助ASLR,PE文件每次加载到内存的起始地址都会随机变化,并且每次运行程序时相应进程的栈以及堆的起始地址也会随机改变。也就是说,每次EXE文件运行时加载到进程内存的实际地址都不同,最初加载DLL文件时装载到内存中的实际地址也是不同的。
微软采用这种方式加载PE文件是为了增加系统的安全性。大部分Windows OS安全漏洞(一般为缓冲区溢出)只出现在特定OS、特定模块、特定版本中。以这些漏洞为目标的漏洞利用代码(exploit code)中,特定内存地址以硬编码的形式编入(因为在以前的OS中,根据OS版本的不同,特定DLL总是会加载到固定地址)。 因此,微软采用了这种ASLR技术,增加了恶意用户编写漏洞利用代码的难度,从而降低了利用OS安全漏洞破坏系统的风险(UNIX/Linux OS等都已采用了ASLR技术)

二、测试ASLR技术

1.一个简单的源文件

#include <iostream>

void main()
{
    printf("ASLR test program...\n");
}

2.生成ALSR.exe与ALSR_no.exe

采用/DYNAMICBASE编译生成ASLR.exe文件。

采用/DYNAMICBASE:NO编译生成ASLR_no.exe文件

采用/DYNAMICBASE编译生成ASLR.exe文件。采用/DYNAMICBASE:NO编译生成ASLR_no.exe文件

3.使用OllDbg调试器查看程序入口地址与栈地址

对比发现ASLR.exe与ASLR_no.exe程序入口地址与堆栈地址不同。

3.1 ASLR.exe

在这里插入图片描述
程序执行完后:

在这里插入图片描述


注:以下图片均为重启计算机后所截的图。

3.2 ASLR_no.exe

在这里插入图片描述
程序执行完后:

在这里插入图片描述

4.使用CFF Explorer查看PE文件信息

4.1 重定位表的区别

ASLR多了一个重定位目录表,即多了一个.reloc节区。ASLR的NumberOfSection比ASLR_no的值大1。

一般而言,普通的EXE文件是不存在.reloc节区的,该节区仅在应用了ASLR技术的文件中才会出现,它是编译器生成并保留的在可执行文件中的。

PE文件被加载到内存时,该节区被用作重定位的参考,它不是EXE文件运行的必须部分,可将其从PE文件中删除。由于DLL文件总是需要重定位,所以DLL文件中不可将其删除。

在这里插入图片描述

4.2 IMAGE_FILE_HEADER/Characteristics属性

ASLR.exe中没有 relocation info stripped from file(IAMGE_FILE_RELOCS_STRIPPED(1))属性
在这里插入图片描述

4.3 IMAGE_OPTIONAL_HEADER/DLL Characteristics属性

ASLR.exe中设有 DLL can move(IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(40))属性,删除这个属性,即可删除ASLR功能。
在这里插入图片描述

5. 删除ASLR功能

修改ASLR.exe文件的可选PE头属性信息,将8140修改为8100(即把IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE(40)属性删除)并另存为ASLR_DEL.exe文件。

再用OllDbg查看ASLR_DEL.exe程序的入口地址以及程序的堆栈地址。
发现程序入口地址变回来了,并没有随机化。

在这里插入图片描述
在这里插入图片描述

三、重启系统后,观察ASLR.exe映射到内存中的变化

重新启动计算机,再次用OllDbg查看ASLR.exe程序的入口地址与堆栈地址。发现重启系统后,程序入口地址与堆栈地址随机化了。

在这里插入图片描述

在这里插入图片描述

ASLR.exe:
采用地址空间随机化
用OllDbg调试发现程序入口地址为AA1343H

重新启动计算机后:
用OllDbg调试发现程序入口地址为201343H


ASLR_no.exe:
不使用地址空间随机化
用OllDbg调试发现程序入口地址为411343H


ASLR_DEL.exe:
把ASLR.exe取消了地址随机化
用OllDbg调试发现程序入口地址为411343H

总结

1、ASLR 机制在每次引导的时候为一个给定的DLL选择一个同样的基地址。但是当系统进行重启后,加载基址就会变化,也就是说可以认为这里的地址随机化在系统启动的时候就进行重定位,此后在此系统中,系统dll在每个进程中的基址相同。

2、如果一个要详细分析的文件应用了ASLR功能,分析前可以暂时将ASLR功能删除,然后再调试分析,由于文件总是被加载到相同的内存地址,所以分析起来会更简便。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shlyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值