Heap Spray原理

什么是Heap Spray?

  堆喷射是在 shellcode 的前面加上大量的slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得内存被大量的注入代码占据。然后通过结合其他漏洞控制程序流,使得程序执行到堆上,最终将导致shellcode的执行。
  常见的slide code有NOP指令,还有一些类NOP指令,比如0x0c,0x0d等。它们的共同特点都是不会影响shellcode的执行。
  可能覆盖到的地址是0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等。

Heap Spray实现过程

  我们通过解决以下问题来理解堆喷射的实现过程及原理:

Q1:slide code和shellcode是如何填充的?

  在我们申请并填充的大量堆空间中,并不是只有一个shellcode,实际上,由于系统对堆的管理是有分块机制存在的,因此我们将申请到的空间分成了很多块来分别进行填充,在每一块空间中,都先使用slide code进行填充,而在该空间末端用shellcode进行填充。这意味着我们填充的大量堆空间的形式类似如下:

Heap
±-------------+
| silde code |
| shellcode |
±-------------+
| silde code |
| shellcode |
±-------------+

Q2:为什么要在shellcode前加上大量slide code?

  由于只有在攻击时命中shellcode的第一条语句,才能成功执行shellcode,如果用shellcode进行填充,意味着在MB级别内可能仅有几十Byte左右的语句是shellcode的起始语句,这决定了命中shellcode的概率极小,几乎接近0。
  若我们使用slide code进行填充,根据Heap Spray的描述我们知道,由于slide code是nop指令或者类似于nop的空指令,因此只要我们命中slide code中的任意一条指令,这条指令都将引导程序执行到shellcode的第一条命令。而又因为slide code占了堆空间的绝大部分,因此命中的概率几乎接近100%。

Q3:为什么填充内存常在200MB以上?
  1. 由于堆的分布不均衡(存在碎片),所以最先分配的一些堆块的地址可能是无规律的,但是如果大量的分配堆块,就会出现稳定的地址分布。也就是说,内存中碎片过多,必须喷射到更高的地址才能使 exploit 更稳定。
  2. 通常在申请的内存超过200M时,地址0x0c0c0c0c才会确定被含有shellcode的内存片覆盖,以便执行shellcode。

堆分配图:

Q4:为什么是0x0c0c0c0c?

  当然也可以为其他地址,如:0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等,但地址0x0c0c0c0c是堆喷射应用中最著名的地址。堆喷射成功的前提是,我们填充的过程中恰好覆盖了一个虚函数指针,当该虚函数被调用时,先取得栈中的对象指针,通过对象指针取得虚表指针,然后在虚表内适当偏移处取得函数指针执行,过程如下:

  因此根据上述过程,当我们使用“0c0c0c0c”作为slide code进行填充时,我们地址0x0c0c0c0c处也必须为“0c0c0c0c”,而正由于这个地址是自指向的,因此恰好执行“0c0c0c0c”命令直到执行shellcode。若为其他地址,将会导致指针跳转至其他地方,无法确保完成shellcode的执行。
  也可以通过缓冲区溢出漏洞将EIP修改为0x0c0c0c0c就能跳转到该位置,然后完成shellcode的执行。

Heap Spray的优缺点

优点:

  1. 增加缓冲区溢出攻击的成功率;
  2. 覆盖地址变得更加简单了,可以简单使用类nop指令来进行覆盖;
  3. 它也可以用于堆栈溢出攻击,用slide code覆盖堆栈返回地址即可;

缺点:

  1. 会导致被攻击进程的内存占用暴增,容易被察觉;
  2. 不能用于主动攻击,一般是通过栈溢出利用或者其他漏洞来进行协同攻击;
  3. 上面说了,如果目的地址被shellcode覆盖,则shellcode执行会失败,因此不能保证100%成功。

检测与防范

  1. 如果发现应用程序的内存大量增加(设置阈值),立即检测堆上的数据,看是否包含大量的slidecode。
  2. 当浏览器的脚本解释器开始重复申请堆的时候,监控模块可以记录堆的大小、内容和数量,如果这些重复的堆请求到达了一个阀值或者覆盖了指定的地址(譬如0x0C0C0C0C,x0D0D0D0D等等),监控模块立即阻止脚本的执行。
  3. 对于一些利用脚本(Javascript Vbscript Actionscript)的进行Heap Spray攻击的情况,可以通过hook脚本引擎,分析脚本代码,根据一些Heap Spray常见特征,检测是否受到Heap Spray攻击。
  4. 开启DEP

参考资料

[1]. Heap Spray(堆喷射)简介
[2]. Heap Feng Shui in JavaScript
[3]. 32位下的堆喷射技术
[4]. Heap Spray原理浅析

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

D-A-X

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

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

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

打赏作者

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

抵扣说明:

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

余额充值