java中asl_带你认识绕不开的ASLR
发布日期:2021-06-24 16:13:29 浏览次数:2 分类:技术文章

本文共 1974 字,大约阅读时间需要 6 分钟。

微软从windows vista/windows server 2008(kernel version 6.0)开始采用ASLR技术,主要目的是为了防止缓冲区溢出ASLR技术会使PE文件每次加载到内存的起始地址随机变化,并且进程的栈和堆的起始地址也会随机改变。

ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、MacOS、Windows等主流操作系统都已采用了该技术。

一、主要特点

1、映像随机化

经典的方法是用注册表项HKLM\SYSTEM\CurrentControlSet\Session Manager\Memory Management的方法对映像随机化禁用  设置为0 禁用 ,-1强制对可随机化的映像进行处理,其他值正常工作;

各模块的低位2位不变;

只是对加载基址的前2个字节做了随机处理;

2、堆栈随机化

XP下不具备,VISTA具备,每次获取堆地址不同;不需要精确跳转的,溢出手段影响有限;

3、PEB TEB随机化

XP SP2中已经引入了,使用随机性的基址。

提取代码:

unsigned int teb;

unsigned int peb;

__asm

{

mov eax,fs:[0x18]

mov teb,eax

mov eax,dword ptr [eax+0x30

mov teb,eax]

}

printf("PEB:%#x\nTEB:%#x",peb,teb);

getchar();

4、VS2019中支持ASLR

该技术需要操作系统和编译工具的双重支持(主要是操作系统的支持,编译工具主要作用是生成支持ASLR的PE格式); 若不想使用ASLR功能,可以在VS(2019)编译的时候将“配置属性->链接器->高级->随机基址”的值修改为否即可。

1c1da46260e20d10e758784cf21481b2.png

5、工具鉴别

这里我们用一个工具ASLRProcessScanner来查看下ASLR是否打开,

084bff8875a2daadfa02ebe7dbc3805c.png

发现这个程序是打开了ASLR。

这个程序有如下的用法,

7b96711f6bb4d35c3c13f8b6e0e694f5.png

可以批量指出当前运行的进程有哪些具备ASLR,也可以对指定进程、程序进行检测。

二、比对PE信息

准备两个PE程序,一个有ASLR,一个没有 ASLR,用PEView查看,

f84e938c8090f728515e887f106d4cda.png

ASLR.exe比NoASLR.exe多了一个.reloc节区,这个节区存储了程序中的硬编码信息。

IMAGE_FILE_HEADER\Characteristics

3acaeef0ed0ed7d6d8fecd103b97e28f.png

发现ASLR.exe比NoASLR.exe少了一个“IMAGE_FILE_RELOCS_STRRIPED(0001)”标志,该标志的含义是:

Relocation information was strippedfrom the file. The file must be loaded at its preferred base address. If the base address is not available, the loader reports an error.

换个工具看下,

4663ded52503d27106888c3ea45f7df4.png

ASLR.exe位置的数值为 0,而NoASLR.exe位置的数值为 1;也就意味着这里我只要置为 1 就可关闭ASLR;

三、关闭ASLR,便于调试

ASLR技术会使PE文件每次加载到内存的起始地址随机变化,并且进程的栈和堆的起始地址也会随机改变。

该技术需要操作系统和编译工具的双重支持(主要是操作系统的支持,编译工具主要作用是生成支持ASLR的PE格式)。

1、关闭操作系统的ASLR

操作系统方面关闭ASLR支持,不知道在哪里关闭怎么办呢?没关系,我们可以看看别人是怎么做的。

96f67caef50d6cf7316b464645c113c9.png

2006ef20c0a983ca0f6ab9d4be677a2e.png

可以看到注册表添加了一个DWORDRD键值项HKLM\System\CurrentControlSet\Control\SESSION MANAGER\MEMORY MANAGEMENT\MoveImages,其值为0。

2、关闭PE头中ASLR

那么这个时候我们可以通过修改PE头中可选头的Characteristics来达成我们的目的。

9aaa7e49f6e86046960f53c37b58ac8e.png

bb052a3abf61fb72de21e2b823774bb0.png

将这个0x0103改成0x0102就可以关闭PE中的ASLR了。

3、这样每次加载的时候都是在同一个地址,调试起来的时候是固定地址了。用OD逆向的时候,和IDA中的地址对上了。

至此,简单介绍完毕。

这是我的第100篇文章,非常有纪念意义!

同时,这篇文章居然是在“魔都”完成的,没想到的缘份;今天也是这个公众号开办整整9个月,一切都值得纪念。

转载地址:https://blog.csdn.net/weixin_33744799/article/details/114768185 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java复杂性_java – 计算Big-O复杂性
下一篇:linux setuid函数_setuid函数解析

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月27日 03时57分28秒