记某次从控件漏洞挖掘到成功利用
字数 1331 2025-08-18 11:37:16
ActiveX控件栈溢出漏洞挖掘与利用技术详解
一、漏洞挖掘流程
1. 前期信息收集
-
使用COMRaider工具分析控件
- 识别控件属性、函数等关键信息
- 提供fuzz功能辅助漏洞发现
-
静态分析工具准备
- IDA Pro反汇编工具
- com.plw插件(用于识别控件函数)
2. 关键函数分析
-
函数识别
- 使用IDA加载控件文件
- Ctrl+F11调用插件识别可被浏览器直接调用的函数
-
OpenDevice函数分析
- 参数追踪:
- lFlags参数:与0xF00进行与运算后用于分支判断
- szAppID参数:重点关注的处理对象
- 参数追踪:
-
漏洞点定位
- WideCharToMultiByte函数转换szAppID为多字节字符串
- 字符串拷贝函数(strcpy)未限制长度
- 目的缓冲区String1大小仅74h字节
3. 漏洞验证方法
-
测试页面构造
- 触发条件:lFlags&0xF00为768或256
- 溢出条件:szAppID长度≥78h
-
调试器设置
- 使用OllyDbg附加IE进程
- 设置"暂停于新模块"选项
- 在关键位置设置断点:
- 字符串拷贝函数调用前
- 函数RETN指令前
-
溢出效果验证
- 观察EBP下内容
- 确认返回地址被覆盖
- 浏览器崩溃验证漏洞存在
二、漏洞利用技术
1. 利用环境准备
- 目标系统:Windows XP SP3(无ASLR和DEP保护)
- 利用思路:覆盖返回地址+shellcode执行
2. 利用步骤详解
-
跳板地址寻找
- 在系统DLL中查找jmp esp指令
- 示例:advapi32.dll中的\x77DEF049
-
payload构造
- 前120字节:填充字符'A'
- 121-124字节:跳板地址(\x49\xF0\xDE\x77)
- 125-136字节:12字节填充字符'B'
- 137字节起:shellcode
-
调试验证
- 确认EIP跳转到jmp esp地址
- 验证ESP指向shellcode起始位置
3. Shellcode处理技巧
-
编码问题解决
- WideCharToMultiByte函数会修改\x80以上字符
- 解决方案:使用仅包含\x80以下字符的shellcode
-
shellcode生成
- 使用msfvenom生成兼容shellcode:
msfvenom -p windows/exec CMD=calc.exe -f c -a x86 --platform windows -b '\x00\x80\x81\x82...' -e x86/alpha_mixed
- 使用msfvenom生成兼容shellcode:
-
最终利用
- 将生成的shellcode嵌入payload
- 验证计算器成功弹出
三、安全防护建议
1. 安全编码实践
-
字符串处理函数替代方案
- 使用strncpy替代strcpy:
char buf[MAX]; strncpy(buf, src, MAX-1); buf[MAX-1] = '\0'; - 使用snprintf替代sprintf:
char buf[MAX]; snprintf(buf, sizeof(buf), "%s", src);
- 使用strncpy替代strcpy:
-
缓冲区初始化
- 在使用前初始化缓冲区
- 确保字符串终止符的存在
2. 防御机制
-
编译选项
- 启用栈保护(/GS)
- 启用安全异常处理
-
运行时保护
- DEP(数据执行保护)
- ASLR(地址空间布局随机化)
- SafeSEH
四、技术要点总结
-
漏洞挖掘关键
- 关注所有外部可控参数
- 重点检查字符串操作函数
- 验证缓冲区实际大小
-
漏洞利用关键
- 精确控制溢出偏移量
- 处理字符编码转换问题
- 适应目标环境选择shellcode
-
调试技巧
- 模块加载断点设置
- 关键指令地址定位
- 内存数据验证
本技术文档详细记录了从ActiveX控件漏洞挖掘到成功利用的全过程,涵盖了静态分析、动态调试、漏洞利用和安全防护等关键环节,可作为二进制漏洞研究的参考范例。