3. 固件逆向分析基础:固件提取、解包与二进制分析

固件逆向分析,说白了就是跟设备“对话”,搞清楚它到底在跑什么。我做了这么多年固件安全,最深的体会就是:拿到固件只是第一步,能把它拆开、看懂、找到漏洞,才是真本事。这一章,咱们就聊聊固件逆向的三个核心环节——提取、解包、二进制分析。

核心逻辑:固件逆向 = 获取原始数据 → 还原文件系统 → 分析二进制代码。三步缺一不可。

固件逆向分析知识体系 固件提取技术 硬件/软件/网络 固件解包与文件系统 binwalk / unsquashfs 二进制分析 Ghidra / IDA Pro SPI Flash 读取 JTAG/SWD 提取 文件系统识别 解包与挂载 字符串分析 反汇编/反编译 ⚠ 关键原则 先识别固件结构 → 再选择提取方式 → 最后针对性分析

3.1 固件提取技术:怎么把固件“弄到手”

固件提取,就是获取设备上原始固件二进制数据的过程。听起来简单,但实际坑不少。我遇到过很多次,设备看起来能正常跑,但固件就是读不出来——要么被加密了,要么被锁死了。

常见的提取方式分三类:

提取方式 适用场景 工具/方法 难度
硬件提取 SPI Flash、NAND Flash CH341A 编程器、Flashrom 中
软件提取 运行中的系统 dd、cat /dev/mtd* 低
网络提取 OTA 更新包、Web 下载 Wireshark、curl、固件服务器 低-中
调试接口提取 JTAG/SWD 接口 OpenOCD、J-Link 高

我的习惯:拿到一个新设备,先查它的 SoC 型号和 Flash 芯片型号。去网上搜一下,大概率能找到现成的提取方案。别一上来就拆芯片,先试试软件提取——省时省力。

举个例子,从运行中的 Linux 设备提取固件:

# 查看 MTD 分区
cat /proc/mtd

# 提取整个 Flash
dd if=/dev/mtd0 of=/tmp/firmware.bin

# 或者用 cat
cat /dev/mtdblock0 > /tmp/firmware.bin

嗯,这里要注意:提取前一定要确认分区布局。我见过有人把 bootloader 当成整个固件提取出来,分析半天发现不对劲。

3.2 固件解包与文件系统分析:拆开看看里面有什么

拿到固件二进制后,第一件事就是看看它是什么格式。你想想看,一个固件文件可能包含 bootloader、内核、文件系统、配置数据……乱七八糟的东西全塞在一起。

我个人最常用的工具是 binwalk。它能自动识别固件中的各种文件签名。

# 扫描固件中的文件签名
binwalk firmware.bin

# 自动提取所有识别到的文件
binwalk -e firmware.bin

# 指定提取 SquashFS 文件系统
binwalk -Me firmware.bin

binwalk 跑完之后,你会得到一个文件夹,里面是各种提取出来的文件。最常见的文件系统类型有:

  • SquashFS:只读压缩文件系统,路由器、IoT 设备最爱
  • JFFS2 / UBIFS:可读写文件系统,常用于 NAND Flash
  • CPIO:initramfs 常用格式
  • CramFS:老设备上常见

对于 SquashFS,我建议用 unsquashfs 手动解包:

# 查看 SquashFS 信息
unsquashfs -s extracted_squashfs.bin

# 解包到指定目录
unsquashfs -d ./rootfs extracted_squashfs.bin

我曾经踩过的坑:有些厂商会对文件系统进行魔改,比如修改 SquashFS 的魔数或压缩算法。这时候 binwalk 可能识别不出来。我的经验是——手动搜索文件系统特征字符串,比如 "hsqs"(SquashFS 魔数),然后用 dd 手动切割。

解包之后,你会得到一个完整的根文件系统。这时候可以开始“翻箱倒柜”了:

  • /bin、/sbin:核心二进制文件
  • /etc:配置文件、密码文件
  • /lib:动态链接库
  • /www 或 /htdocs:Web 管理界面
  • /usr/bin:用户态程序

3.3 固件二进制分析:从字节码到漏洞

文件系统解包后,真正的分析工作才开始。二进制分析分两个层面:静态分析和动态分析。

3.3.1 静态分析:不运行代码,直接看

静态分析是最基础的手段。说白了,就是拿着二进制文件,用各种工具“看”它。

第一步:字符串分析

# 提取所有可打印字符串
strings firmware.bin | head -100

# 按长度过滤,避免噪音
strings -n 8 firmware.bin | grep -E "(password|admin|root|key|secret)"

字符串分析能快速发现硬编码密码、密钥、路径信息。我在一个路由器固件里找到过厂商的 SSH 私钥——直接就能登录所有同型号设备。

第二步:架构识别

# 查看文件类型
file ./bin/busybox

# 输出示例:ELF 32-bit LSB executable, ARM, version 1 (SYSV)

知道架构后,才能选对反汇编工具。ARM、MIPS、x86 的指令集完全不同。

第三步:反汇编与反编译

我个人习惯用 Ghidra(免费、开源、功能强)或 IDA Pro(商业、更成熟)。

工具 优点 缺点 推荐场景
Ghidra 免费、支持多架构、反编译质量高 Java 环境、启动慢 日常分析、团队协作
IDA Pro 插件生态丰富、交互流畅 价格昂贵、许可证限制 深度逆向、漏洞挖掘
Radare2 / Rizin 命令行、脚本化、轻量 学习曲线陡峭 自动化分析、远程环境

我的建议:新手先用 Ghidra。它免费,而且反编译出来的 C 伪代码可读性很高。等你需要分析混淆代码或加壳固件时,再考虑 IDA Pro。

3.3.2 动态分析:让固件跑起来

静态分析只能看到代码结构,但有些行为必须运行才能发现。比如网络通信、加密解密、条件触发等。

动态分析常用方法:

  • QEMU 用户态模拟:运行单个二进制文件
  • QEMU 系统态模拟:模拟整个设备
  • Firmadyne / FirmAE:自动化固件模拟框架

举个例子,用 QEMU 运行一个 ARM 架构的二进制:

# 安装 ARM 模拟环境
sudo apt install qemu-user-static

# 运行 ARM 二进制
qemu-arm-static ./bin/webserver

# 配合 chroot 模拟文件系统
sudo chroot . ./qemu-arm-static /bin/webserver

注意:动态分析时,一定要在隔离环境中运行。我见过有人直接在宿主机上跑固件里的二进制,结果把网络配置搞乱了。用 Docker 或虚拟机隔离,这是底线。

3.4 实战流程:从固件到漏洞的完整路径

说了这么多,咱们串一下完整流程。我一般按这个步骤走:

  1. 获取固件:从官网下载、从设备提取、从 OTA 抓包
  2. 识别格式:用 file、binwalk 看固件结构
  3. 解包文件系统:binwalk -e 或手动解包
  4. 文件系统分析:找配置文件、密码、密钥、Web 文件
  5. 二进制分析:字符串扫描 → 反汇编 → 找漏洞点
  6. 漏洞验证:QEMU 模拟运行,触发漏洞

核心要点:固件逆向不是一次性的工作。你可能需要反复在静态分析和动态分析之间切换。比如,静态分析发现一个可疑函数,动态运行确认它的行为,再回到静态分析看调用链。