Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc

Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc

ID:47031848

大小:676.51 KB

页数:33页

时间:2019-07-01

Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc_第1页
Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc_第2页
Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc_第3页
Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc_第4页
Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc_第5页
资源描述:

《Exploit编写系列教程第十一篇堆喷射技术揭秘(下).doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Exploit编写系列教程第十一篇:堆喷射技术揭秘(下)【作者】:PeterVanEeckhoutte【译者】:hellokHeaplibCache&Plunger技术–oleaut32.dll正如AlexanderSotirov在上文中说的,申请字符串(通过SysAllocString)不总是从系统堆里面申请的,而是通常被一个oleaut32中的堆管理引擎来处理。这个引擎管理内存,以方便快速分配/再分配。还记得我们前面看到的堆栈跟踪吗?每次一个内存块被释放后,堆管理器就会尝试把指向那个内存堆块的指针保存到缓存中(要做到这一点,需要满足几个条件,但这些条件都不影响我们)。这些

2、指针指向在堆中的任何位置,所以所有数据都有可能出现在某个地方。当一个新的分配情况,缓存系统会看它是否有一大块所要求的大小,可以直接返回。这将提高性能,并在一定程度上也阻止了堆碎片。32767bytes大小以上的块会直接被释放掉,并且不会被缓存。缓存管理表按块大小排序组织。每一小块“bin”在缓存表里可以保存堆块的数值。有4种“bin”:每一个bin可以保存6个指针。理想的情况下,做堆喷雾时,我们要确保我们的分配是由系统堆处理。通过这种方式,基于堆的可预测性的特点,连续申请会导致在同一内存地点的连续内存空间。缓存管理器返回的地址可以在堆里面的任何地方,所以地址将是不可靠的。由于

3、缓存中每个bin只能容纳6个地址,mr.Sotirov提出了“plunger”的技术,其刷新缓存中的所有块,并让他们空下来。如果缓存中没有块,缓存不能分配任何块还给你,所以确保你的内存申请使用的是系统堆,而不是oleaut32中的堆。这将增加获得连续内存块的可预见性。为了做到这一点,因为他在他的论文中解释说,他只是试图申请缓存列表中的6块(1和32之间的大小的内存块申请6块,6块大小33和64之间,并为每个bin依此类推,如上表)。这样一来,他确保了缓存是空的。“刷新”后发生的分配,将由系统堆处理。垃圾回收(GarbageCollector)如果我们要提高堆的布局,我们也需要

4、能够调用垃圾收集器,当我们需要它(而不是等待它运行)。幸运的是,在InternetExplorer中的JavaScript引擎暴露了CollectGarbage()函数,我们将使用到他。当然你也可以通过heaplib来调用它。使用分配大小大于32676字节在堆喷雾时,你甚至可能不会需要担心调用gc()函数。在useafterfree的情况下,如果逆向重新分配一个特定的缓存块在一个制定的地址,您可能还需要调用GC,以确保您重新分配正确的块。分配和碎片整理(Allocations&Defragmentation)结合“plunger”技术,我们可以在任意时刻根据我们的需求调用GC

5、,申请给定大小的内存块,进一步,可以尝试整理堆。通过继续分配我们所需要的确切大小的块,堆布局中的所有可能的孔将被填补。一旦我们打破了碎片,分配将是连续的。他们的实现在下面2个文件中:lib/rex/exploitation/heaplib.js.b64lib/rex/exploitation/heaplib.rb第二个就是简单的加载/解码base64编码了的javascript库(heaplib.js.b64),并且添加了一些混淆。如果逆向查看javascript代码,只需简单的base64解码下就可以。这里,我们使用linux环境下的base64命令来:base64-dhe

6、aplib.js.b64>heaplib.js在heaplib中,申请是下面这个函数来实现的:heapLib.ie.prototype.allocOleaut32=function(arg,tag){varsize;//Calculatetheallocationsizeif(typeofarg=="string"

7、

8、arginstanceofString)size=4+arg.length*2+2;//len+stringdata+nullterminatorelsesize=arg;//Makesurethatthesizeisvalidif((size&0xf)!=0)

9、throw"Allocationsize"+size+"mustbeamultipleof16";//Createanarrayforthistagifdoesn'talreadyexistif(this.mem[tag]===undefined)this.mem[tag]=newArray();if(typeofarg=="string"

10、

11、arginstanceofString){//Allocateanewblockwithstrdupofthestringargumentthis.mem[tag

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。