VxWorks设备分析与漏洞挖掘
字数 1566 2025-08-29 08:30:36

VxWorks设备分析与漏洞挖掘技术指南

1. 前言

VxWorks作为一款实时操作系统(RTOS),广泛应用于工控系统、网络设备(如路由器)等领域。本文以TP-Link TL-WDR7660路由器为例,详细介绍VxWorks固件的分析方法与漏洞挖掘技术。

2. 固件获取

从TP-Link官网获取目标设备固件:

https://service.tp-link.com.cn/download/20207/TL-WDR7660%E5%8D%83%E5%85%86%E7%89%88%20V1.0%E5%8D%87%E7%BA%A7%E8%BD%AF%E4%BB%B620190830_2.0.30.zip

3. 固件分析

3.1 VxWorks固件特征

使用binwalk分析原始固件时,可能看不到完整的文件系统结构。关键特征包括:

  • MINIFS文件系统标识
  • 特殊的映像结构

3.2 VxWorks系统映像概述

3.2.1 映像分类

BootRom类型

  • BootRom_res:仅数据段拷贝至RAM,代码段驻留ROM运行
  • BootRom_uncmp:非压缩映像,代码段与数据段均拷贝至RAM运行
  • BootRom:压缩格式映像,需在RAM中解压后执行

主系统类型

  • 可加载映像:通过BootRom从网络/存储设备加载至RAM运行
  • ROM驻留映像:代码段固化在ROM中运行,仅数据段加载至RAM
  • ROM压缩映像:压缩后存储于ROM,启动时解压至RAM运行

3.2.2 引导启动过程

  1. Bootstrap硬件初始化阶段

    • 上电复位:CPU从固定地址执行指令
    • 执行romInit():汇编代码完成处理器寄存器初始化
  2. 代码迁移阶段

    • 调用romStart():
      • 非压缩映像:将代码段和数据段从ROM/Flash拷贝至RAM
      • 压缩映像:解压代码至RAM后跳转执行
    • 内存初始化:冷启动时清零BSS段及用户保留内存区域
  3. 内核激活阶段

    • 执行sysInit():创建单任务环境,跳转至usrInit()
    • 调用usrInit():初始化内核数据结构,激活多任务环境
    • usrRoot()任务:完成核心初始化(硬件驱动、文件系统、系统任务)

标准引导流程:Bootstrap硬件初始化 → BootRom加载内核 → VxWorks内核启动

3.3 文件系统提取

  1. 使用binwalk识别架构(如ARM)和映像类型(uImage和LZMA压缩数据)
  2. 提取uBoot程序:
    dd if=wdr7660gv1-cn-up_2019-08-30_10.37.02.bin of=uboot.raw bs=1 skip=512 count=66048
    
  3. 解压主程序:
    lzma -d main.lzma
    

3.3.1 加载地址确定

方法一:通过MyFirmware指纹查找

  • 定位MyFirmware字符,往前查找段末尾(通常用0xFF或0x00补齐)
  • 当前段开头偏移0x18处的两个4字节为VxWorks系统映像的加载地址(如0x40205000)

方法二:分析固件头部初始化代码

  1. 使用IDA分析ARM小端固件
  2. 查找R0加载的值(Vxworks程序启动流程)
  3. 识别usrInit()函数入口(通常跟随sysInit() → usrInit()的标准启动序列)

3.4 字符表修复

方法一:使用vxhunter工具

  1. 从binwalk解压文件中寻找符号文件
  2. 使用bzero函数定位符号表(grep -r bzero .
  3. 使用vxhunter导入文件系统

方法二:手动分析符号表结构

  1. 符号表开头为文件大小(如00051B29)
  2. 随后是符号数量(如000034E4)
  3. 符号条目以8比特排列
  4. 计算符号表位置:开头+8*符号数量

Python3修复脚本示例(需根据实际情况调整):

# 此处应添加实际的符号表修复代码

修复后IDA将显示正确的函数名和调用关系。

4. 漏洞挖掘实例

以CVE-2022-26987为例:

  1. tWlanTask函数通过recvfrom接收数据
  2. 数据经过MmtAtePrase解析
  3. 漏洞点:MmtAtePrase未严格校验输入,导致数据未正确截断引发溢出

关键点:

  • 识别关键函数调用链
  • 分析数据流路径
  • 验证输入校验完整性

5. 参考资源

  • VxWorks官方手册
  • vxhunter工具
  • 相关CVE漏洞报告

附录:实用命令

  1. 固件提取:
dd if=original_firmware.bin of=extracted_part bs=1 skip=OFFSET count=LENGTH
  1. 解压LZMA:
lzma -d compressed_file.lzma
  1. 搜索符号表:
grep -r "bzero" ./extracted_fs
  1. 架构识别:
binwalk -A firmware.bin
VxWorks设备分析与漏洞挖掘技术指南 1. 前言 VxWorks作为一款实时操作系统(RTOS),广泛应用于工控系统、网络设备(如路由器)等领域。本文以TP-Link TL-WDR7660路由器为例,详细介绍VxWorks固件的分析方法与漏洞挖掘技术。 2. 固件获取 从TP-Link官网获取目标设备固件: 3. 固件分析 3.1 VxWorks固件特征 使用binwalk分析原始固件时,可能看不到完整的文件系统结构。关键特征包括: MINIFS文件系统标识 特殊的映像结构 3.2 VxWorks系统映像概述 3.2.1 映像分类 BootRom类型 : BootRom_ res:仅数据段拷贝至RAM,代码段驻留ROM运行 BootRom_ uncmp:非压缩映像,代码段与数据段均拷贝至RAM运行 BootRom:压缩格式映像,需在RAM中解压后执行 主系统类型 : 可加载映像:通过BootRom从网络/存储设备加载至RAM运行 ROM驻留映像:代码段固化在ROM中运行,仅数据段加载至RAM ROM压缩映像:压缩后存储于ROM,启动时解压至RAM运行 3.2.2 引导启动过程 Bootstrap硬件初始化阶段 上电复位:CPU从固定地址执行指令 执行romInit():汇编代码完成处理器寄存器初始化 代码迁移阶段 调用romStart(): 非压缩映像:将代码段和数据段从ROM/Flash拷贝至RAM 压缩映像:解压代码至RAM后跳转执行 内存初始化:冷启动时清零BSS段及用户保留内存区域 内核激活阶段 执行sysInit():创建单任务环境,跳转至usrInit() 调用usrInit():初始化内核数据结构,激活多任务环境 usrRoot()任务:完成核心初始化(硬件驱动、文件系统、系统任务) 标准引导流程:Bootstrap硬件初始化 → BootRom加载内核 → VxWorks内核启动 3.3 文件系统提取 使用binwalk识别架构(如ARM)和映像类型(uImage和LZMA压缩数据) 提取uBoot程序: 解压主程序: 3.3.1 加载地址确定 方法一 :通过MyFirmware指纹查找 定位MyFirmware字符,往前查找段末尾(通常用0xFF或0x00补齐) 当前段开头偏移0x18处的两个4字节为VxWorks系统映像的加载地址(如0x40205000) 方法二 :分析固件头部初始化代码 使用IDA分析ARM小端固件 查找R0加载的值(Vxworks程序启动流程) 识别usrInit()函数入口(通常跟随sysInit() → usrInit()的标准启动序列) 3.4 字符表修复 方法一 :使用vxhunter工具 从binwalk解压文件中寻找符号文件 使用bzero函数定位符号表( grep -r bzero . ) 使用vxhunter导入文件系统 方法二 :手动分析符号表结构 符号表开头为文件大小(如00051B29) 随后是符号数量(如000034E4) 符号条目以8比特排列 计算符号表位置:开头+8* 符号数量 Python3修复脚本示例(需根据实际情况调整): 修复后IDA将显示正确的函数名和调用关系。 4. 漏洞挖掘实例 以CVE-2022-26987为例: tWlanTask函数通过recvfrom接收数据 数据经过MmtAtePrase解析 漏洞点:MmtAtePrase未严格校验输入,导致数据未正确截断引发溢出 关键点: 识别关键函数调用链 分析数据流路径 验证输入校验完整性 5. 参考资源 VxWorks官方手册 vxhunter工具 相关CVE漏洞报告 附录:实用命令 固件提取: 解压LZMA: 搜索符号表: 架构识别: