博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中asl_带你认识绕不开的ASLR
阅读量:1541 次
发布时间:2019-04-21

本文共 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个月,一切都值得纪念。

转载地址:http://ylrdy.baihongyu.com/

你可能感兴趣的文章
vscode主题颜色设置为light,代码颜色花里胡哨
查看>>
document.getElementById(“id“)和document.querySelector(“#id名“)的区别
查看>>
块级元素和内联元素大致一览
查看>>
前端笔试题(css选择题)
查看>>
css sprites ----雪碧图
查看>>
css样式初始化(引用的一个大佬的文章!)
查看>>
获得某某年某月某日某时分秒的时间,头部添0用到padStart()
查看>>
数字、英文字母的升序和降序
查看>>
点击按钮随机使200小块变色(随机布局的小案例)
查看>>
前端笔试题js(容易翻车的小坑)(不定时更新)
查看>>
简单的写一个距离未来某个时间的倒计时
查看>>
小人移动(onkeydown小案例)
查看>>
点击浏览器页面生成随机大小的随机颜色的小球,好玩
查看>>
点击移动小块
查看>>
鼠标跟随
查看>>
使文字滚动的一个标签 marquee 超好玩(亲测,chrome浏览器可以使用)类似于弹幕评论效果!!
查看>>
三天打鱼,两天晒网js
查看>>
九九乘法表(正向和反向都有啊)
查看>>
简单制作点名器 原生js
查看>>
使用js+html简单制作时钟
查看>>