第 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 暴露?
动手练习
- 下载一个开源路由器固件(如 OpenWrt、或 D-Link 旧固件),binwalk 解包,找到文件系统里的用户和配置。
- 用 unblob 解一个 SquashFS,手动提取其中单个二进制并 QEMU 仿真运行。
- 跑一次 EMBA(如果有条件),看输出报告结构。
- 分析启动脚本,画出设备的启动流程。
深入阅读
- 仓库:
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