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 段(高熵)的边界。
验证方法与判定标准
完成以下检查即视为分析成功:
binwalk扫描输出中明确列出 Squashfs 文件系统及其偏移量(0x600000附近);binwalk -e成功提取出squashfs-root目录,且目录内包含 Linux 根文件系统的标准子目录(bin、etc、lib等);- 使用
mount -o loop可挂载提取出的 Squashfs 文件(需 sudo),并能读取etc/openwrt_release文件确认版本信息。
若你的固件镜像包含其他结构(如 JFFS2、LZMA 压缩段或 U-Boot 头部),binwalk 同样会列出对应签名——识别这些签名并确认其偏移量即为本案例的核心能力。
常见问题
- binwalk 未识别任何签名:先运行
binwalk -E查看熵分布,若整体熵值极高,可能固件已加密,需先解密;若整体熵值低,可能是未压缩的裸数据,需手动分析。 - 提取失败:确认已安装
squashfs-tools(sudo apt install squashfs-tools),binwalk 依赖外部工具完成解包。 - 偏移量差异:不同版本固件偏移不同,以实际扫描输出为准,不要硬编码偏移值。