1. 固件镜像文件格式识别

固件镜像文件格式识别 学习卡片

任务目标

给定一个未知格式的固件镜像文件 router_fw.bin,使用 file 和 binwalk 工具识别其文件系统类型、CPU 架构及内部文件布局,为后续逆向分析与 OTA 漏洞挖掘建立基础。

环境准备

在 Linux 主机(推荐 Ubuntu 22.04+)上安装所需工具:

sudo apt update
sudo apt install -y binwalk file
# 如需递归提取 SquashFS/ubi 文件系统,可额外安装:
sudo apt install -y mtd-utils ubi-reader

关键完整代码(识别脚本)

以下脚本对目标固件执行 file 与 binwalk 扫描,并输出结构化结果:

#!/bin/bash
# identify_fw.sh — 固件镜像格式识别脚本
# 用法: ./identify_fw.sh <firmware_image>

if [ $# -ne 1 ]; then
    echo "用法: $0 <firmware_image>"
    exit 1
fi

IMG="$1"

echo "===== [1] file 识别结果 ====="
file "$IMG"

echo ""
echo "===== [2] binwalk 文件签名扫描 ====="
binwalk "$IMG"

echo ""
echo "===== [3] binwalk 熵分析(判断是否加密/压缩) ====="
binwalk -E "$IMG" | tail -20

echo ""
echo "===== [4] 尝试提取已知文件系统 ====="
# 仅提取,不递归展开(避免超大输出)
binwalk -e -M --dd='.*' "$IMG" 2>/dev/null || \
    echo "自动提取失败,请手动检查上述签名输出"

运行方式

chmod +x identify_fw.sh
./identify_fw.sh router_fw.bin

验证方法与判定标准

以典型 OpenWrt 路由器固件为例,预期输出应包含以下关键特征,满足即判定识别成功:

  • file 输出:包含 Linux kernel ARM boot executable zImage 或 uImage 字样,表明架构为 ARM;若为 MIPS 则显示 MIPS 相关标识。
  • binwalk 签名扫描:在偏移 0x0 或附近出现 SquashFS filesystem、JFFS2 filesystem、ubi filesystem 等条目,并显示文件系统版本(如 little endian, version 4.0)。
  • 熵分析:若固件未加密,熵值曲线在文件系统区域呈现中等水平(约 5~7);若整体熵值接近 8 且无文件签名,则表明镜像可能被加密或压缩,需进一步处理。
  • 提取结果:_router_fw.bin.extracted 目录下出现 squashfs-root 或 jffs2-root 文件夹,内含 /etc、/bin 等标准 Linux 目录结构。

常见问题

  • binwalk 未识别出文件系统:可能镜像经过自定义加密或头部偏移。尝试 binwalk -R 手动指定签名,或使用 binwalk -A 查看所有架构字符串。
  • file 显示 "data":说明镜像头部无标准魔数,需依赖 binwalk 的熵分析和字符串扫描(strings 命令辅助)判断内部结构。
  • 提取后文件系统无法挂载:确认是否缺少 squashfs-tools,安装后使用 unsquashfs 手动解包。
router_fw.bin (原始二进制镜像) file 命令输出 Linux kernel ARM boot executable zImage, big endian → 架构: ARM (BE) binwalk 签名扫描 0x0: uImage header (ARM) 0x100: SquashFS v4.0, LE → 文件系统: SquashFS 识别结论 固件类型: Linux 内核 + SquashFS 根文件系统 CPU 架构: ARM 大端序 | 可提取: squashfs-root

上述流程完成后,即可确认固件的文件系统类型(如 SquashFS、JFFS2、CramFS)与 CPU 架构(ARM/MIPS/RISC-V 等),为后续固件解包、漏洞分析或恶意代码植入提供必要前提。