逆向工程实战手册 第 15 章

第 15 章 固件与 IoT 逆向

固件逆向从"一个 .bin"开始,最终目标是理解设备行为、发现漏洞、甚至拿到 shell。方法遵循 OWASP FSTM 九阶段:提取 → 解包 → 静态分析 → 仿真 → fuzz → 利用

📍 知识点地图 | 主题:固件与IoT | 前置:第3章 | 后续:第30章 | 核心概念:binwalk、SquashFS、QEMU、EMBA

15.1 固件逆向全链路

1. 提取: 从官网/升级包/物理闪存拿固件
2. 解包: binwalk/unblob 识别并解压文件系统
3. 静态分析: 找已知 CVE / 硬编码密钥 / 危险配置
4. 仿真: QEMU/Firmadyne 跑起来
5. 动态调试: 在仿真环境调试、fuzz
6. 利用: 把漏洞变成 shell

15.2 解包(binwalk / unblob)

# 快速扫描
binwalk firmware.bin
binwalk -Me firmware.bin          # 递归提取

# unblob(新一代,识别率高很多)
unblob firmware.bin               # 自动识别并提取所有类型

常见文件系统与工具:

文件系统 提取
SquashFS binwalk 自动 / unsquashfs
JFFS2 jefferson / binwalk
UBI/UBIFS ubireader / binwalk
CPIO (initramfs) cpio -idmv
CramFS cramfsck
自定义压缩 手动分析压缩算法
# 常见套路: 解不开就试各种压缩器
unsquashfs -comp xz|lzma|lzo|gzip rootfs.squashfs

15.3 内核提取

# 从固件找内核镜像
binwalk firmware | grep -i "kernel\|zImage\|uImage"
# zImage/uImage → vmlinux
vmlinux-to-elf zImage          # 或从 vmlinux-to-elf 工具
# 然后就可以 Ghidra/IDA 加载 vmlinux 分析了

15.4 静态分析要点

□ 硬编码凭证: grep -r "password\|admin\|root:" 解包后的文件系统
□ 已知 CVE: EMBA / cve-bin-tool 自动扫
□ 危险服务: telnetd/dropbear/lighttpd 配置
□ 启动脚本: /etc/init.d、rcS、/etc/passwd
□ 固件更新机制: 是否校验签名
□ 设备树 (DTB): 看硬件布局
□ U-Boot 环境变量: 启动参数、串口配置

15.5 自动化审计:EMBA

# EMBA = 固件自动化审计工具(全链路)
sudo ./emba -l ./log -f firmware.bin
# 输出: 已知 CVE、危险配置、硬编码密钥、证书分析

15.6 仿真(QEMU / Firmadyne)

QEMU 用户态(最快,跑单个程序)

# 跨架构运行固件里的单个二进制
qemu-arm-static ./busybox
qemu-aarch64-static -L rootfs ./program

全系统仿真(Firmadyne/FAT)

# Firmadyne: 自动把路由器固件跑起来
./firmadyne.sh firmware.bin
# FAT: 全自动 QEMU 仿真工具集
./fat.py firmware.bin

仿真价值:可以在仿真环境里调试、fuzz、写 exploit,不需要真实设备。

15.7 架构专项速查

ARM

ARM 指令 4 字节, Thumb 2 字节
函数指针 LSB: 0=ARM, 1=Thumb(切换模式的关键)
Ghidra 可自动切换(Processor Options)
大端/小端: file 命令看,Ghidra 里选

MIPS

分支延迟槽: 分支后的指令一定执行(还原时易错点!)
$gp 全局指针: PIC 模式指向 .got
lui + addiu: 分两次加载 32 位常量

RISC-V

QEMU: qemu-riscv64-static 仿真
GDB 支持良好: gdb-multiarch
OpenOCD: 硬件调试(JTAG)

15.8 RTOS 分析

常见 RTOS: VxWorks、ThreadX、FreeRTOS、Zephyr
难点: 无标准 ELF 元数据,符号靠人工/专有工具
对策: 找 RTOS 特征字符串(VxWorks 的 WIND_)、模块表

15.9 硬件接口(可选进阶)

UART: 串口接上拿 shell(常见默认无认证)
JTAG: 调试接口(OpenOCD + GDB)
SPI Flash: 直接 dump 芯片内容(flashrom)
CAN 总线: 汽车/IoT 通信分析(candump + 重放)

15.10 固件渗透检查清单

□ 解包成功? 文件系统完整?
□ 硬编码密码/密钥?
□ 已知 CVE(EMBA 扫出来)
□ 危险服务默认开启?
□ 固件更新签名校验?
□ 仿真能跑起来? 能在里面调试?
□ Web 管理界面漏洞(很多固件带 web 服务)
□ UART/JTAG 暴露?

动手练习

  1. 下载一个开源路由器固件(如 OpenWrt、或 D-Link 旧固件),binwalk 解包,找到文件系统里的用户和配置。
  2. 用 unblob 解一个 SquashFS,手动提取其中单个二进制并 QEMU 仿真运行。
  3. 跑一次 EMBA(如果有条件),看输出报告结构。
  4. 分析启动脚本,画出设备的启动流程。

深入阅读

  • 仓库:skills/firmware-pentest/SKILL.md(FSTM 九阶段总纲)
  • 仓库:skills/firmware-pentest/references/extraction-methodology.md(提取方法论)
  • 仓库:skills/firmware-pentest/references/emba-automated-analysis.md(EMBA 自动化)
  • 仓库:skills/firmware-pentest/references/emulation-and-fuzz.md(Firmadyne/QEMU/AFL++)
  • 仓库:skills/reverse-engineering/platforms.md(嵌入式/IoT 章节、ARM/MIPS/RTOS)
  • 实战案例:skills/field-journal/seed-015_iot-firmware-uart.md