微软从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)编译的时候将“配置属性->链接器->高级->随机基址”的值修改为否即可。

5、工具鉴别

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

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

这个程序有如下的用法,

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

二、比对PE信息

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

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

IMAGE_FILE_HEADER\Characteristics

发现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.

换个工具看下,

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

三、关闭ASLR,便于调试

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

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

1、关闭操作系统的ASLR

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

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

2、关闭PE头中ASLR

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

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

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

至此,简单介绍完毕。

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

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

java中asl_带你认识绕不开的ASLR相关推荐

  1. java mysql 占位符_在Java中编写带占位符的SQL语句

    C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...

  2. java中不带package和带package的编译运行方式

    Java中不带package的程序和带package的程序编译的方式是不同的. 一.不带package的程序 建立个HelloWorld.java的文件,放入C:\,内容如下: public clas ...

  3. IDEA中文件带问号,打不开(可能是不小心点击了Open matching files in associated application)

    IDEA中文件带问号,打不开(可能是不小心点击了Open matching files in associated application) 今天用IEDA的时候,创建联级文件时,.*之后不知道点了什 ...

  4. java开关用法_如何在Java中使用带开关盒的枚举?

    Java中的枚举(枚举)是一种存储一组常量值的数据类型.您可以使用枚举来存储固定值,例如一周中的天,一年中的月等.enum Days { SUNDAY, MONDAY, TUESDAY, WEDNES ...

  5. Java中的带参方法

    1.有返回值的带参方法 看下面代码: 1)字符串型: public String zhaZhi( String shuiGuo){ return shuiGuo+"汁"; 代码括号 ...

  6. java中print换行符_如何在java中打印带换行符的字符串

    我需要使用 java打印一个字符串,所以我喜欢以下解决方案经过google搜索了很多.我做了一些更改来打印字符串而不显示打印对话框.我的问题是虽然这个方法正确地打印了字符串,但它不会像我定义的那样破坏 ...

  7. 【基础巩固篇】Java中的Buffer缓冲区探究

    作者:不清不慎,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! 一.什么是缓冲区,与缓存的区别? 首先简单的说下什么是缓存,缓冲的目的的是用来缓解应用程序上下层之间的性能差异,从 ...

  8. java中实现客户姓名添加和显示

    java中使用带参的方法实现对学生姓名的添加和显示: 首先我们创建一个名为Student类的学生类,由于需要添加多个学生信息,那么我们就先在Student类中声明一个存放学生姓名的数组: String ...

  9. Java中的null是什么?

    As we know null is an important concept in every language not only in Java but here we will study va ...

最新文章

  1. 面试官:你说熟悉MySQL事务,那来谈谈事务的实现原理吧!
  2. TF之TFOD-API:基于tensorflow框架利用TFOD-API脚本文件将YoloV3训练好的.ckpt模型文件转换为推理时采用的.pb文件
  3. 循环神经网络应用案例
  4. java php html,java和html的区别是什么
  5. ASP.NET URL编码处理
  6. 种子点生长算法下——三维种子点生长
  7. 如何从网页上下载内嵌的PDF文件
  8. 计算机教程求和,电脑excel求和怎么操作步骤 | excel竖列自动求和sum
  9. codecademy里能学好php,在iPhone上学编程:Codecademy
  10. 服务器托管显示ping命令,用PING命令Ping通网络摄像机显示的数据是什么意思
  11. idw matlab 程序_idw插值算法的C#和Matlab简单实现
  12. 考研英语 - word-list-3
  13. 计算机二级swot分析,基于SWOT模型的学科竞争力研究
  14. IT真的不如卖爆米花的?
  15. 0018-量化第五天:QMT—日内回转回测注释
  16. thinkphp发送邮箱(以thinkphp5作为示例)。
  17. linux 操作系统安全加固
  18. 一篇文章搞定毕业论文页眉页脚格式
  19. 程序是如何跑起来的?
  20. Python-爬虫(requests库、二进制数据(图片)获取,GET/POST请求、session请求)

热门文章

  1. 语雀携手Teambition,玩转项目协作与知识管理
  2. 阿里新一代分布式任务调度平台Schedulerx2.0破土而出
  3. Pod在多可用区worker节点上的高可用部署 1
  4. 再谈全局网HBase八大应用场景
  5. 如何像阿里巴巴一样高效跨企业项目协作
  6. 哈哈!TCP泄露了操作系统信息···
  7. 刷爆了!这份被程序员疯传的Python神作牛在哪?
  8. 微服务架构到底是什么鬼?
  9. 【潜龙勿用】中国制造业数字化转型大潮下的冷思考
  10. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]