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 引导启动过程
-
Bootstrap硬件初始化阶段
- 上电复位:CPU从固定地址执行指令
- 执行romInit():汇编代码完成处理器寄存器初始化
-
代码迁移阶段
- 调用romStart():
- 非压缩映像:将代码段和数据段从ROM/Flash拷贝至RAM
- 压缩映像:解压代码至RAM后跳转执行
- 内存初始化:冷启动时清零BSS段及用户保留内存区域
- 调用romStart():
-
内核激活阶段
- 执行sysInit():创建单任务环境,跳转至usrInit()
- 调用usrInit():初始化内核数据结构,激活多任务环境
- usrRoot()任务:完成核心初始化(硬件驱动、文件系统、系统任务)
标准引导流程:Bootstrap硬件初始化 → BootRom加载内核 → VxWorks内核启动
3.3 文件系统提取
- 使用binwalk识别架构(如ARM)和映像类型(uImage和LZMA压缩数据)
- 提取uBoot程序:
dd if=wdr7660gv1-cn-up_2019-08-30_10.37.02.bin of=uboot.raw bs=1 skip=512 count=66048 - 解压主程序:
lzma -d main.lzma
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漏洞报告
附录:实用命令
- 固件提取:
dd if=original_firmware.bin of=extracted_part bs=1 skip=OFFSET count=LENGTH
- 解压LZMA:
lzma -d compressed_file.lzma
- 搜索符号表:
grep -r "bzero" ./extracted_fs
- 架构识别:
binwalk -A firmware.bin