记某次从控件漏洞挖掘到成功利用
字数 1331 2025-08-18 11:37:16

ActiveX控件栈溢出漏洞挖掘与利用技术详解

一、漏洞挖掘流程

1. 前期信息收集

  1. 使用COMRaider工具分析控件

    • 识别控件属性、函数等关键信息
    • 提供fuzz功能辅助漏洞发现
  2. 静态分析工具准备

    • IDA Pro反汇编工具
    • com.plw插件(用于识别控件函数)

2. 关键函数分析

  1. 函数识别

    • 使用IDA加载控件文件
    • Ctrl+F11调用插件识别可被浏览器直接调用的函数
  2. OpenDevice函数分析

    • 参数追踪:
      • lFlags参数:与0xF00进行与运算后用于分支判断
      • szAppID参数:重点关注的处理对象
  3. 漏洞点定位

    • WideCharToMultiByte函数转换szAppID为多字节字符串
    • 字符串拷贝函数(strcpy)未限制长度
    • 目的缓冲区String1大小仅74h字节

3. 漏洞验证方法

  1. 测试页面构造

    • 触发条件:lFlags&0xF00为768或256
    • 溢出条件:szAppID长度≥78h
  2. 调试器设置

    • 使用OllyDbg附加IE进程
    • 设置"暂停于新模块"选项
    • 在关键位置设置断点:
      • 字符串拷贝函数调用前
      • 函数RETN指令前
  3. 溢出效果验证

    • 观察EBP下内容
    • 确认返回地址被覆盖
    • 浏览器崩溃验证漏洞存在

二、漏洞利用技术

1. 利用环境准备

  • 目标系统:Windows XP SP3(无ASLR和DEP保护)
  • 利用思路:覆盖返回地址+shellcode执行

2. 利用步骤详解

  1. 跳板地址寻找

    • 在系统DLL中查找jmp esp指令
    • 示例:advapi32.dll中的\x77DEF049
  2. payload构造

    • 前120字节:填充字符'A'
    • 121-124字节:跳板地址(\x49\xF0\xDE\x77)
    • 125-136字节:12字节填充字符'B'
    • 137字节起:shellcode
  3. 调试验证

    • 确认EIP跳转到jmp esp地址
    • 验证ESP指向shellcode起始位置

3. Shellcode处理技巧

  1. 编码问题解决

    • WideCharToMultiByte函数会修改\x80以上字符
    • 解决方案:使用仅包含\x80以下字符的shellcode
  2. 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
      
  3. 最终利用

    • 将生成的shellcode嵌入payload
    • 验证计算器成功弹出

三、安全防护建议

1. 安全编码实践

  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);
      
  2. 缓冲区初始化

    • 在使用前初始化缓冲区
    • 确保字符串终止符的存在

2. 防御机制

  1. 编译选项

    • 启用栈保护(/GS)
    • 启用安全异常处理
  2. 运行时保护

    • DEP(数据执行保护)
    • ASLR(地址空间布局随机化)
    • SafeSEH

四、技术要点总结

  1. 漏洞挖掘关键

    • 关注所有外部可控参数
    • 重点检查字符串操作函数
    • 验证缓冲区实际大小
  2. 漏洞利用关键

    • 精确控制溢出偏移量
    • 处理字符编码转换问题
    • 适应目标环境选择shellcode
  3. 调试技巧

    • 模块加载断点设置
    • 关键指令地址定位
    • 内存数据验证

本技术文档详细记录了从ActiveX控件漏洞挖掘到成功利用的全过程,涵盖了静态分析、动态调试、漏洞利用和安全防护等关键环节,可作为二进制漏洞研究的参考范例。

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: 最终利用 将生成的shellcode嵌入payload 验证计算器成功弹出 三、安全防护建议 1. 安全编码实践 字符串处理函数替代方案 使用strncpy替代strcpy: 使用snprintf替代sprintf: 缓冲区初始化 在使用前初始化缓冲区 确保字符串终止符的存在 2. 防御机制 编译选项 启用栈保护(/GS) 启用安全异常处理 运行时保护 DEP(数据执行保护) ASLR(地址空间布局随机化) SafeSEH 四、技术要点总结 漏洞挖掘关键 关注所有外部可控参数 重点检查字符串操作函数 验证缓冲区实际大小 漏洞利用关键 精确控制溢出偏移量 处理字符编码转换问题 适应目标环境选择shellcode 调试技巧 模块加载断点设置 关键指令地址定位 内存数据验证 本技术文档详细记录了从ActiveX控件漏洞挖掘到成功利用的全过程,涵盖了静态分析、动态调试、漏洞利用和安全防护等关键环节,可作为二进制漏洞研究的参考范例。