关于DEP、ASLR的兼容性问题分析

  • DEP带来的兼容性问题
    • 一、硬件方面
    • 二、内核方面
    • 三、功能方面
  • ASLR带来的兼容性问题
    • 一、内核方面
    • 二、硬件方面
    • 三、后注

DEP带来的兼容性问题


一、硬件方面

不具有DEP技术支持的CPU将无法从硬件层面对内存页进行保护从而应用DEP,在此情况下,软件支持的DEP并不能直接阻止在数据页上执行代码。

二、内核方面

32位系统只能通过引导至PAE模式来支持DEP,并不能通过PTE的高双字的最高bit即bit63来实现(PTE的第63位控制着页的可执行属性)。

即这个位置为0,表示此页不可执行;没有置为0,表示此页可以执行。

而32位系统的页目录和页表项只有32个bit,所以不可能提供DEP的这个保护位,因此DEP只有在64bit的PTE上才能实现。

而只有cr4的bit5即PAE启用的时候,PTE才为64bit。

三、功能方面

用于将内存位置标记为不可执行的DEP,会导致32位软件出现兼容性问题。

这是因为DEP阻止了某些程序的运行,可能会导致这些应用程序被挂起而产生无法运行的错误。


ASLR带来的兼容性问题


一、内核方面

在Windows的32位系统与64位系统中,其地址随机化的位数与方式均是不同的。

在32位系统中,Windows只尝试随机化32位地址中的8位,这些是位从16到23,只影响地址的页目录条目和页表条目部分。

原因是操作系统不能简单地将地址的任意位随机化,在页面部分(0到11位)中随机分配偏移量将打破程序对数据对齐的假设。

页面目录指针(位30和31)也不能被更改,因为第31位是为内核保留的;而第30位被物理地址扩展用作存储体交换技术,以寻址2 GB以上的RAM,这使得32位地址中的14位不能被随机化。

而在64位系统中,Windows对64位程序的基地址随机化程度会更高,从而使攻击64位程序的难度比攻击完全相同程序的32位版本的难度高上数百倍。

故将32位代码重新编译为64位会大大增加可供地址空间布局随机化选择的基本地址数量,也可以大大提高其抗攻击能力。

二、硬件方面

ASLR无法在部分较落后的硬件上保障其保护能力。

首先,处理器有个称为内存管理单元(MMU)的部件,负责映射计算机在内存中存储程序的地址。为跟踪这些地址,MMU频繁查询名为页表的目录。

VUSec攻击(disclosed in 2017)的关键,在于设备通常将页表存储在处理器缓存中——让最常访问的信息随时可被计算核调用的一小块内存。这种做法可以提升芯片处理速度和效率。

但是,网页上运行的一段恶意JavaScript代码,同样可以写入那块缓存。最关键的是,它还能同时查看MMU的工作速度。

通过密切监视MMU,JavaScript代码可以找出其自身地址——攻击代码会复写缓存,一次一个单元,直到看到MMU降速,MMU要执行4次单独的页表查询,才能找到任给代码段的物理地址。

因此,该攻击会重写缓存4次,搜出缓存中存放页表的4个地方。每一次,恶意程序都会记下MMU降速的时刻。

MMU走到该降速时刻的耗时,就成为了恶意代码自身在缓存中地址的提示信息,当设备将攻击代码从缓存中拷贝到RAM中时,ASLR想隐藏起来的代码内存地址就暴露无遗了。

因此,若要彻底的防范ASLR攻击,完全修复该硬件漏洞最终将需要更换硬件,而非软件。设备将需要建立在重新设计的新架构之上的新芯片——MMU与处理器缓存中的页表相互隔离。

三、后注

该漏洞于2017年初被阿姆斯特丹自由大学的研究员Ben Gras和他的同事Kaveh Razavi披露,使得ASLR在不同硬件设备上的表现能力产生差异(至少2017年以前生产的硬件均无法较好地防御该漏洞)。

而此后较为完善的ASLR保护机制很可能无法作用于这些较为老旧的芯片。

关于DEP、ASLR的兼容性问题分析相关推荐

  1. vue在微信里面的兼容问题_微信H5页面兼容性问题分析及解决方法

    随着H5页面越来越流行,越来越多的开发者都开始用最近H5做微信公众号,在这个过程中自然也会遇到不少的问题.小编在这里整理了五种常见的微信H5页面兼容性问题,来和大家分析一下问题的详情.出现原因以及相对 ...

  2. Universal DEP/ASLR bypass with msvcr71.dll and mona.py

    转载自: https://www.corelan.be/index.php/2011/07/03/universal-depaslr-bypass-with-msvcr71-dll-and-mona- ...

  3. 手机app兼容性测试点分析(通用)

  4. 当我精通vue2的源码dep和watcher的关系时

    watcher与dep的关系程序运行分析 初始化执行 _init => initState() + vm.$mounted initState => initData + initWatc ...

  5. 滴水逆向三期 win10 ASLR UnmapViewOfSection傀儡进程 加密壳项目

    特意加了一个win10标题, 碰到0xc0000005的朋友就不要再浪费时间了, 我在这个问题上花了整整一天 网上全是xp的代码, 搜到了了几个win10的也是同样的错误没法解决, 唯一一个有用的答案 ...

  6. 一步一步分析vue之observe

    上一期,本我们讲了__data这个vue的属性是怎么一回事,本期,我们将用到vue的(2.5.9)版本,让我们了解一下observe 让我们看看observe都包含什么成员 observe = {va ...

  7. 溢出科普:heap overflow溢出保护和绕过

    pr0mise · 2016/04/11 9:50 0x00 第一部分:heap overflow 接上文,来看另外一种溢出方式:堆溢出.相对于栈溢出来说,稍微麻烦一点 本文算是一个笔记,技术有限,难 ...

  8. KALI LINUX渗透测试学习笔记

    KALI LINUX渗透测试学习笔记 (苑房弘主讲) 第1章 课程介绍 任务1:Kali Linux渗透测试介绍.exe 安全问题的根源: 分层思想 只求功能实现 最大的威胁是人 渗透测试: 尝试挫败 ...

  9. 进军IT与安全行业:推荐学习路线图

    进军IT与安全行业:推荐学习路线图--转载于其它论坛博客       IT是一个生机勃勃的行业,不少年轻人选择IT作为自己的职业规划与选项,希望能够在IT行业里挖掘自己的潜力,奔一个好的前程.但很多朋 ...

最新文章

  1. 【 FPGA 】FIR 滤波器结构和优化(二)之系数填充(Coefficient Padding)
  2. 在代码中向ReportViewer动态添加数据源
  3. Android动画(一)-视图动画与帧动画
  4. 深入理解多线程(二)—— Java的对象模型
  5. Jenkins deploy to container部署war到tomcat(学习笔记十六)
  6. java-判断相同和对象比较大小
  7. ant编辑java忽略注释_java – Ant警告:隐式编译的文件不受注释处理
  8. 传输层 :TCP/UDP 协议(用于封装接口)
  9. Linux内核defconfig在哪,Linux内核根目录中的配置文件.config中包含了许多宏定义,...
  10. 静态代理、动态代理、AOP
  11. UIViewController生命周期的理解
  12. java 有序map_Java有序的Hash集合:LinkedHashMap
  13. 《Python游戏趣味编程》 第6章 见缝插针
  14. javascript:typeof与instanceof区别
  15. Cadence PSpice 基于代码生成仿真模型
  16. 深入浅出统计学-第二章
  17. [STL]priority_queue多种方式自定义排序
  18. TM7705(AD7705)驱动调试总结-基于stm32f103zet6-填坑日记
  19. Phpcms v9建站详细流程
  20. 五、原型模式(Prototype Pattern)

热门文章

  1. python画三维坐标_使用PyOpenGL绘制三维坐标系实例
  2. SpringBoot+Shiro+Vue实现身份验证
  3. 苹果“软”了,更好卖 | WWDC 2018
  4. H5 中div标签及其属性
  5. BZOJ4031——HEOI小z的房间
  6. 高数培训7:无穷级数
  7. java for循环写法优化,Java优化for循环嵌套的高效率方法
  8. 1.3数据库系统结构及组成(三级模式结构)
  9. 三菱FX3U PLC S型速度曲线生成FB
  10. 专业级MongoDB桌面客户端:MongoBooster for Mac