4、固件逆向分析基础:binwalk工具使用、固件解包与文件系统挂载、识别CPU架构与操作系统

做边缘网关安全,第一步就是拿到固件后能把它「拆开」。你想想看,一个黑盒子摆在你面前,不拆开怎么知道里面装了什么?固件逆向分析,说白了就是给嵌入式设备做「解剖」。这一章我会带你从最基础的 binwalk 工具开始,一步步把固件拆开、挂载文件系统,最后识别出它的 CPU 架构和操作系统。

我个人习惯把固件分析分为三个层次:拆包 → 看文件系统 → 识别架构。这三步走完,你基本就能摸清这个固件的底细了。

核心要点:固件逆向分析不是玄学,而是有章可循的工程方法。掌握好 binwalk 和文件系统挂载,你就拿到了进入嵌入式世界的第一把钥匙。

4.1 binwalk 工具:固件分析的瑞士军刀

binwalk 是我用得最多的固件分析工具,没有之一。它本质上是一个固件「扫描器」,能识别出固件文件中嵌入的各种文件系统和代码段。

4.1.1 安装与基本使用

安装很简单,我建议直接从 GitHub 拉最新版:

# 安装依赖
sudo apt-get install build-essential python3-pip liblzma-dev

# 克隆最新版 binwalk
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo python3 setup.py install

# 验证安装
binwalk --help

嗯,这里要注意:不要用 apt 直接装,版本太旧,很多新固件格式识别不了。我在项目中吃过这个亏,用旧版 binwalk 扫了半天什么都没发现,换了新版才看到文件系统。

4.1.2 常用命令速查

命令 作用 我的使用场景
binwalk firmware.bin 扫描固件,列出所有可识别的文件/文件系统 拿到固件后第一件事
binwalk -Me firmware.bin 扫描并自动提取所有文件 快速解包,省得手动一个个拆
binwalk -D 'png:image:raw' firmware.bin 按类型提取特定文件 只想要固件里的图片或配置文件
binwalk -T firmware.bin 显示文件偏移和大小信息 分析固件结构布局

小技巧:用 -Me 参数时,binwalk 会自动递归解包。我曾经遇到一个固件,里面套了三层压缩,手动解会疯掉,-Me 一把搞定。

4.2 固件解包实战:从 bin 到文件系统

光说不练假把式。我们拿一个典型的边缘网关固件来实操一下。

4.2.1 扫描固件结构

$ binwalk edge_gateway_v2.3.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             u-boot legacy uImage, Linux...
64            0x40            LZMA compressed data
131072        0x20000         Squashfs filesystem, little endian, version 4.0
262144        0x40000         JFFS2 filesystem, little endian
524288        0x80000         u-boot legacy uImage, Linux...
...

看到这个输出,你就能大致判断固件的结构了。最前面是 u-boot 引导程序,然后是 Squashfs 文件系统,后面还有 JFFS2。为什么会这样?因为很多网关设备有双分区设计——一个主系统,一个备份系统。

4.2.2 提取文件系统

提取文件系统有两种方式:

  1. 自动提取:binwalk -Me firmware.bin,一步到位,但会生成很多文件夹
  2. 手动提取:用 dd 命令按偏移量切割,更精确

我个人习惯先用自动提取看看整体结构,再用手动提取处理关键部分:

# 自动提取
binwalk -Me edge_gateway_v2.3.bin

# 手动提取 Squashfs(偏移量 0x20000,大小自己算)
dd if=edge_gateway_v2.3.bin of=squashfs_part.bin bs=1 skip=131072 count=131072

避坑指南:我曾经遇到一个固件,binwalk 识别出了 Squashfs,但提取后挂载失败。后来发现是固件厂商在文件系统头部加了自定义签名,需要先去掉前 32 字节才能正常挂载。遇到这种情况,用 hexdump 看看文件头,对比标准 Squashfs 魔数(hsqs),就能发现问题。

4.3 文件系统挂载:让固件「活」起来

提取出文件系统镜像后,我们需要把它挂载到本地目录,这样才能像操作普通 Linux 文件系统一样浏览里面的内容。

4.3.1 挂载 Squashfs

Squashfs 是嵌入式设备最常见的只读文件系统,压缩率高,适合存储固件:

# 安装工具
sudo apt-get install squashfs-tools

# 挂载 Squashfs 镜像
sudo mount -t squashfs squashfs_part.bin /mnt/firmware -o loop

# 查看内容
ls -la /mnt/firmware/
# 你会看到 bin/ etc/ lib/ usr/ 等标准 Linux 目录结构

4.3.2 挂载 JFFS2

JFFS2 是专门为 Flash 设计的日志型文件系统,常用于存储运行时数据:

# 安装工具
sudo apt-get install mtd-utils

# 模拟 NAND Flash 设备
sudo modprobe mtdblock
sudo modprobe mtdram total_size=65536 erase_size=256

# 将 JFFS2 镜像写入模拟设备
sudo dd if=jffs2_part.bin of=/dev/mtdblock0

# 挂载
sudo mount -t jffs2 /dev/mtdblock0 /mnt/jffs2

小技巧:挂载后第一件事,我通常会看 /etc/init.d/ 和 /etc/config/ 目录。这两个地方藏着设备的启动脚本和配置信息,能快速了解设备的功能和漏洞面。

4.4 识别 CPU 架构与操作系统

知道文件系统里有什么之后,下一步就是搞清楚这个固件跑在什么硬件上。这决定了你后续用什么工具做动态分析。

4.4.1 从文件系统识别

挂载文件系统后,看几个关键文件就能判断:

文件/目录 能看出什么
/bin/busybox 嵌入式 Linux 标配,看它链接的库能判断架构
/lib/ 下的 .so 文件 用 file 命令查看 ELF 格式,直接显示架构
/etc/os-release 或 /etc/version 操作系统版本和构建信息
/proc/cpuinfo(如果可读) CPU 详细信息,但固件里通常是空的

4.4.2 用 file 命令快速判断

# 随便找一个 ELF 文件
file /mnt/firmware/bin/busybox

# 输出示例
# /mnt/firmware/bin/busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3

# 或者看动态链接器
file /mnt/firmware/lib/ld-linux.so.3
# 输出:ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV)

看到 ARM, EABI5 就说明这是 ARM 架构,32 位小端序。如果是 MIPS, MIPS-I 那就是 MIPS 架构。嗯,这里要注意:大端序和小端序的区别,ARM 通常是小端,但有些老设备会用大端,搞错了后面调试会出问题。

4.4.3 从引导程序识别

如果文件系统挂载失败,可以从 u-boot 或内核镜像入手:

# 提取 u-boot 部分(假设偏移 0x0)
dd if=firmware.bin of=uboot.bin bs=1 count=131072

# 查看 u-boot 字符串
strings uboot.bin | grep -i "arm\|mips\|powerpc\|arch"

# 或者直接看内核镜像
binwalk -Y firmware.bin  # 显示可能的架构

实战经验:有一次我拿到一个工控网关的固件,binwalk 扫描显示是 MIPS 架构,但挂载文件系统后发现 /lib/ 下全是 ARM 的 .so 文件。后来才发现,这个固件用了 QEMU 用户态模拟来跑 ARM 程序。所以,不要只看一个地方就下结论,要多方验证。

4.5 知识体系总览

这一章的内容比较多,我画了一张图帮你理清思路:

固件逆向分析基础流程 1. 固件扫描 binwalk 识别结构 2. 固件解包 提取文件系统镜像 3. 文件系统挂载 Squashfs / JFFS2 4. 识别 CPU 架构与 OS ARM / MIPS / x86 · Linux / VxWorks 关键输出 • 固件结构布局(引导程序 + 文件系统 + 配置分区) • 文件系统内容(可执行文件、配置文件、Web 资源) • CPU 架构(决定后续使用什么模拟器和调试器) • 操作系统类型(影响漏洞利用和加固策略)

4.6 常见问题与避坑

做固件分析这些年,我踩过不少坑,挑几个典型的分享给你:

  • binwalk 识别不出文件系统:试试 binwalk -E 启用熵分析,有时候固件被加密或混淆了,熵值会很高,这时候 binwalk 的签名识别会失效。
  • 挂载 Squashfs 报错:检查一下文件系统版本。老设备可能用 Squashfs 3.0,新设备用 4.0,工具不兼容。用 unsquashfs -s 查看版本信息。
  • 文件系统里没有 /bin 目录:有些厂商会把文件系统拆成多个分区,根文件系统在一个分区,应用程序在另一个分区。继续扫描固件,找到所有分区。
  • 识别出的架构和实际不符:我曾经遇到一个固件,binwalk 显示是 MIPS,但实际跑在 ARM 上。后来发现是厂商在固件头里写了错误信息。最终靠反汇编内核镜像才确认。

重要提醒:固件分析一定要在隔离环境中进行。有些固件里可能包含恶意代码,或者解包后会自动执行某些脚本。我建议在虚拟机或 Docker 容器里操作,别直接在宿主机上跑。