1. 固件镜像结构分析

任务说明

本案例将使用 binwalk 分析一个固件镜像,识别其中嵌入的文件系统、压缩段及附加数据。我们以 OpenWrt 官方发布的典型路由器固件(如 openwrt-19.07.0-x86-64-combined-squashfs.img)为例,该镜像可在 OpenWrt 下载服务器公开获取。通过分析,你将掌握固件结构探测的标准流程。

环境准备

在 Ubuntu/Debian 系统上安装所需工具:

sudo apt update
sudo apt install -y binwalk
# 可选:启用 binwalk 的熵分析模块(需 Python 依赖)
sudo pip3 install matplotlib

固件获取与初步分析

下载示例固件(约 8MB):

wget https://downloads.openwrt.org/releases/19.07.0/targets/x86/64/openwrt-19.07.0-x86-64-combined-squashfs.img.gz
gunzip openwrt-19.07.0-x86-64-combined-squashfs.img.gz

首先查看文件类型与基本信息:

file openwrt-19.07.0-x86-64-combined-squashfs.img
ls -lh openwrt-19.07.0-x86-64-combined-squashfs.img

预期输出显示该文件为 Linux kernel x86 boot executable bzImage,大小约 8MB——这已经提示镜像前部是内核,后续需要 binwalk 进一步定位文件系统。

使用 binwalk 扫描固件结构

执行签名扫描:

binwalk openwrt-19.07.0-x86-64-combined-squashfs.img

关键输出应包含类似以下内容(不同版本偏移略有差异):

DECIMAL    HEXADECIMAL    DESCRIPTION
--------------------------------------------------------------------------------
0          0x0            Linux kernel x86 boot executable bzImage
...
6291456    0x600000       Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 2097152 bytes

这表示:偏移 0x600000(6MB)处存在一个 Squashfs 文件系统,大小为 2MB。该文件系统即为 OpenWrt 的根文件系统。

深入分析:提取与验证

为确认扫描结果并查看文件系统内容,执行以下操作:

# 提取 Squashfs 文件系统
binwalk -e openwrt-19.07.0-x86-64-combined-squashfs.img

# 查看提取结果
ls -l _openwrt-19.07.0-x86-64-combined-squashfs.img.extracted/

提取目录中应出现 squashfs-root 文件夹,其中包含完整的根文件系统目录结构(bin/、etc/、usr/ 等)。

进一步验证文件系统类型:

binwalk -A openwrt-19.07.0-x86-64-combined-squashfs.img

该命令执行 CPU 指令架构分析,可识别内核中嵌入的可执行代码架构(预期为 x86-64)。

熵分析(可选但推荐)

当签名扫描无法识别某些段时,熵分析可揭示加密或压缩数据的位置:

binwalk -E openwrt-19.07.0-x86-64-combined-squashfs.img

该命令生成熵图(PNG 文件),高熵区域(熵值接近 1.0)通常对应压缩或加密数据。在生成的熵图中,你能直观看到内核段(较低熵)与 Squashfs 段(高熵)的边界。

验证方法与判定标准

完成以下检查即视为分析成功:

  1. binwalk 扫描输出中明确列出 Squashfs 文件系统及其偏移量(0x600000 附近);
  2. binwalk -e 成功提取出 squashfs-root 目录,且目录内包含 Linux 根文件系统的标准子目录(bin、etc、lib 等);
  3. 使用 mount -o loop 可挂载提取出的 Squashfs 文件(需 sudo),并能读取 etc/openwrt_release 文件确认版本信息。

若你的固件镜像包含其他结构(如 JFFS2、LZMA 压缩段或 U-Boot 头部),binwalk 同样会列出对应签名——识别这些签名并确认其偏移量即为本案例的核心能力。

常见问题

  • binwalk 未识别任何签名:先运行 binwalk -E 查看熵分布,若整体熵值极高,可能固件已加密,需先解密;若整体熵值低,可能是未压缩的裸数据,需手动分析。
  • 提取失败:确认已安装 squashfs-tools(sudo apt install squashfs-tools),binwalk 依赖外部工具完成解包。
  • 偏移量差异:不同版本固件偏移不同,以实际扫描输出为准,不要硬编码偏移值。