- 第一部分: Introduction to Exploit Development
- 第二部分:Saved Return Pointer Overflows
- 第三部分:Structured Exception Handler (SEH)
- 第四部分:Egg Hunters
- 第五部分:Unicode 0x00410041
- 第六部分:WIN32 shellcode 编写
- 第七部分:返回导向编程(ROP)
- 第八部分:堆喷射第一节【覆写 EIP】
- 第九部分:堆喷射[第二章:UAF]
- 第十部分:内核利用程序之栈溢出
- 第十一部分:内核利用程序之任意位置任意写
- 第十二部分:内核利用程序之空指针引用
- 第十三部分:内核利用程序之未初始化栈变量
- 第十四部分:内核利用程序之整数溢出
- 第十五部分:内核利用程序之 UAF
- 第十六部分:内核利用程序之池溢出
- 第十七部分:内核利用程序之任意位置任意写
- 第十八篇:内核利用程序之 RS2 Bitmap 巫术
- 第十九篇:内核利用程序之 Razer
介绍
首先我想给满分 corelanc0d3r 所做的工作. “堆喷射揭秘”是非常好并且很有深度的教程,解释了堆喷射用于 payload 传递的细节. 我很抱歉使用了 corelanc0d3r 之前做的一些工作,但我有我的目的:用一个实际的漏洞来解释堆喷射。
我们知道程序栈可利用的空间是有限的. 堆管理器可以动态的分配很大一块内存,例如程序需要存储临时定义的数据. 堆十分复杂,我不会解释所有的细节. 但我会给你足够的信息帮助你了解它。
关于堆分配器有几件事我们需要知道:
(1) 由于内存动态分配和释放,会产生堆碎片。
(2) 堆内存块释放,会由前端或后端分配器回收(依赖操作系统). 分配器类似于缓存服务那样优化内存块分配. 像之前提到堆分配和释放产生堆碎片(=bad), 为了较少堆碎片,新分配一块内存时,堆分配器会直接返回之前释放的一块同样大小的内存. 从而减少了新分配的次数(=good).
(3) 虽然堆内存是动态分配的,但是分配器往往会连续的分配内存块 (为了减少堆碎片) 这意味着从攻击者的角度来看堆是确定的. 连续的分配内存我们就可以在某个可预测的地址上布置我们的数据。
“堆喷射”概念第一次由 SkyLined 在 2004 年提出. 当时被用于 IE 浏览器 iframe 缓冲区溢出漏洞利用. 这个通用的技术已经被用于大多数浏览器, IE7, firefox 3.6.24, Opera 11.60. 精确堆喷射将在第二部分介绍。
考虑一下这种情况. 如果一个漏洞(可以控制 EIP, UAF, 等等) 允许写任意 4 字节. 我们可以在堆上分配一系列内存块(包含 shellcode), 然后利用漏洞实现 4 字节改写 EIP, 就可以跳去执行堆上的代码. Javascript 可以直接在堆上分配字符串,通过巧妙的布置堆我们可以 exploit 任何的浏览器. 现在主要问题是如何实现稳定的堆分配. 下图应该能给你一些启发:
这足以提起你的兴趣. 首先我们了解堆分配的过程,接下来我们用它实现 ActiveX 的漏洞利用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论