CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析
0x01 2013 Pwn2Own 黑客大赛
- 在 Pwn2Own 的黑客大赛上,来自法国的 VUPEN 安全团队再一次利用 0day 漏洞攻破 Windows8 环境下的 IE10 浏览器,这一次问题出在了 VML 上(VML 是向量标记语言),在处理 VML 语言时,没有对存放 dashstyle 数组长度的整数做严格限制,导致数组的越界访问和赋值,若覆盖 vgx 当中的虚表则可执行任意代码
- 环境:Windows7 + IE8
- 调试分析工具:Windbg32,IDA
- 样本:能触发漏洞的 poc(提取码:ofhv)
- 漏洞 dll:vgx.dll
0x02 根据样本分析漏洞成因
- 开启堆页启动多线程调试,拖入样本触发异常,可以看出可能是数组在寻址时访问越界了,由于在 memcpy 函数中,所以传入的参数一定是有问题的
- 从堆栈也可以看出是 vgx!COALineDashStyleArray 的 get_item 函数出了问题,由于是 JavaScript 的调用,那么样本应该有调用函数,经过分析是调用了 item() 函数导致数组越界访问
for (var i=0; i<0x400; i++) { // POC 样本
a[i].marginLeft = "a";
marginLeftAddress = vml1.dashstyle.array.item(0x2E+0x16);
if (marginLeftAddress > 0) {
try // i = 0x301 的时候进入
{
shape.dashstyle.array.item(0x2E+0x16+i) = 0x4b5f5f4b;
}
catch(e) {continue}
}
}
- vml1.dashstyle 的数组包含 44 个元素
for (var i=0; i<0x400; i++){ // POC 样本
a[i].rotation;
if (i == 0x300) {
vml1.dashstyle = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44"
}
}
- 而 shape 的数组元素不过 8 个,而访问的时候却直接访问第 0x2E+0x16 个元素,转换成 10 进制也就是第 68 个元素,难怪会访问越界
<v:oval><v:stroke id="vml1"/></v:oval> // POC 样本
<v:oval><v:stroke dashstyle="2 2 2 0 2 2 2 0" id="shape"/></v:oval>
- 这个就是 vgx 对象数组的地址,到 2c 的时候刚好是第 44 个元素,而 0x21a85060 刚好是加上 24 个元素之后的地址
- 知道了漏洞的原理,再来看样本中是怎么把数组中的数据给修改掉的,经过研究发现原来是将 vml1 和 shape 的长度设置为了 -1,这个可能就是整数溢出的元凶
vml1.dashstyle.array.length = 0 - 1
shape.dashstyle.array.length = 0 - 1
- 利用 IDA 反汇编 vgx 模块,之后查找 COALineDashStyleArray 类,其中 put_length 就是设置 vgx 对象数组元素的函数,下断之后调试看看(建议断下 vgx 模块后在下断,避免不必要的麻烦)
- 当点击按钮 crash!! 后成功进入了 put_length 函数,继续向下调试
- 之后会获取传入 put_length 的第一个参数,可能是某个对象的地址,继续向下调试
- CElement 函数传入了一个数组对象,跟进这个函数看看
- 在 0x198ed07e 时取出数组对象,之后取出数组大小 0x2c,也就是 44 个,这与样本中的 vml1 的数组元素个数是一致的
- 0x226d2fe8 是 ORG 类对象的地址,可见数组的大小 2c 储存在类变量中
- CElement 函数执行完后,获取传入的第二个参数,也就是设置数组的值(0xFFFFFFFF = -1)
- 之后判断 2c 是否大于 0xFFFFFFFF,无符号比较肯定是 2c 大啊,所以发生跳转
- 如果不发生跳转,则调用 malloc 函数给数组分配额外的空间,这样数组就不会发生溢出了,可惜的是进行了无符号比较,溢出整数 0xFFFFFFFF 成功逃脱了跳转
- 继续向下调试至 0x1993dba4 时将 eax 中存放的数组大小减去 0xFFFFFFFF = 2d
- 从参数中可以看出 ORG 对象也传了进来,跟进 call 函数
- 将设置的数组大小 -1 作为参数调用 MsoDeletePx 函数
- 进入 MsoDeletePx 函数之后,取出 2d 和 0xFFFFFFFF 调用 MsoFREMovePx 函数,跟进这个函数
- 在 MsoFREMovePx 函数的最后,将 ORG 对象数组大小 2c 改为 0xFFFF,之后再调用 item() 函数取出对象时就会以 0xFFFF 作为数组的大小,这样就可以访问和操作数组以外的很大一部分空间,造成数组越界访问
0x03 漏洞利用
- 漏洞利用的方法非常经典,首先创建 0x400 个 v:shape 元素
- 之后将两个 array 的值设置为 -1 造成溢出,最后循环遍历 v:shape 结构,利用获取 marginLest 的值造成信息泄露,计算后可以获取到 ntdll.dll 的基址,从而可以用于构造 ROP 指令,构造完 ROP 指令后覆盖 vgx:CsafePtr 虚表指针,达到执行恶意代码的目的
- 如图所示虚表指针被覆盖
- 参考资料:0day安全:软件漏洞分析技术 + 漏洞战争
对CVE-2013-2551 的分析到此结束,如有错误,欢迎指正(天哪终于分析完了)
CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析的更多相关文章
- BEC合约整数溢出漏洞还原与分析
一.币圈一秒,人间一年 有道是币圈一日,人间一年.这个说法又得升级了,叫币圈一秒,人间一年. 前不久,币圈又出大事啦.BEC智能合约被爆出整数溢出漏洞,导致黑客能无限印币,在一次交易中,也就那么几秒钟 ...
- Linux Kernel 整数溢出漏洞
漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级: 漏洞类型: ...
- Solidity合约中的整数溢出漏洞事件
事件 2018年4月23日 BEC 一夜被偷64亿 2018年4月25日 SMT 再爆类似漏洞,火币Pro和OKEx相继暂停了SMT交易 2018年4月25日 BEC.SMT现重大漏洞,这8个智能合约 ...
- CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
- Nginx整数溢出漏洞 Writeup
Nginx整数溢出漏洞 CVE-2017-7529 题目URL:http://www.whalwl.site:8040/ 漏洞描述 在 Nginx 的 range filter 中存在整数溢出漏洞,可 ...
- gdk-pixbuf tiff_image_parse函数整数溢出漏洞
受影响系统:gdk-pixbuf gdk-pixbuf 2.36.6描述:CVE(CAN) ID: CVE-2017-2870 gdk-pixbuf是一个用于以各种格式加载图像和像素缓冲处理的库. 使 ...
- CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析
0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...
- 程序员---C语言细节7(增加两个整数溢出检测)
主要内容:增加两个整数溢出检测 #include <stdio.h> #include <limits.h> int main(int argc, char *argv[]) ...
- CPP--正码,反码,补码~附整数溢出的探讨
之前说到了long的争议(http://www.cnblogs.com/dotnetcrazy/p/8059210.html),这边就不用long来举例了,用int吧 可以看一下这篇文章(http:/ ...
随机推荐
- C#中事件流程的简单理解
C#中事件流程的简单理解 C#中事件基于委托,要理解事件要先理解委托,但是现在我还没想好怎么写委托,如果不懂委托可以先找找委托的文章 事件基于委托,为委托提供了一种发布/订阅机制 一上来就是这句话,很 ...
- android分析之Binder 02
分析Java层的ServiceManager,看看Binder在Java层是如何实现的. public final class ServiceManager { private static fina ...
- 欢迎参加3月活动:AWS 在线研讨会与阿里云 RISC-V 应用创新大赛
3月份我们在帮合作云厂商 Amazon Web Services(AWS) 与阿里云推广2个活动,欢迎感兴趣的园友参加. 活动一:亚马逊云科技在线研讨会:借助 DGL 实现实时欺诈检测 博客园专属报名 ...
- 输出质数(Java)
输出质数 一.什么是质数 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数,否则称为合数(规定1既不是质数也不是合数). 二.代码实现 1.输出100以内的质数 i ...
- Dotnet洋葱架构实践
一个很清晰的架构实践,同时刨刨MySQL的坑. 一.洋葱架构简介 洋葱架构出来的其实有一点年头了.大约在2017年下半年,就有相关的说法了.不过,大量的文章在于理论性的讨论,而我们今天会用一个项目 ...
- Flutter原理简介
Flutter 是怎么运转的? 与用于构建移动应用程序的其他大多数框架不同,Flutter 是重写了一整套包括底层渲染逻辑和上层开发语言的完整解决方案.这样不仅可以保证视图渲染在 Android 和 ...
- 「Leetcode-算法_MId1006」从单栈到双栈
Mid 1006 笨阶乘 栈/后缀 运算优化 + 栈 思路描述 每四个数一组 这四个数中前三个会进行乘.除 然后与最后一个相加 Stack 入前三个之和 与 最后一个数 以 4 举例 运算式 4 * ...
- 面向前端开发人员的VSCode自动化插件
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://blog.bitsrc.io/vscode-automations-for-fro ...
- 解决跨域问题chrome浏览器插件
https://www.crx4chrome.com/crx/53489/ 解决chrome浏览器跨域的问题
- [Fundamental of Power Electronics]-PART I-4.开关实现-0 序
4 开关实现 在前面的章节中我们已经看到,可以使用晶体管,二极管来作为Buck,Boost和其他一些DC-DC变换器的开关元件.也许有人会想为什么会这样,以及通常如何实现半导体的开关.这些都是值得被提 ...