1. 固件文件类型识别

固件文件类型识别 学习卡片

任务目标

给定一个未知格式的固件文件 firmware.bin,通过 file 与 binwalk 工具识别其文件类型、目标 CPU 架构以及是否包含可提取的文件系统或引导加载程序。

环境准备

在 Linux 虚拟机(推荐 Kali Linux 或 Ubuntu 22.04+)中执行以下命令安装所需工具:

sudo apt update
sudo apt install -y binwalk file

操作步骤与关键代码

首先使用 file 命令获取固件的基本类型信息:

file firmware.bin

预期输出示例(取决于固件内容):

firmware.bin: u-boot legacy uImage, Linux Kernel Image (ARM), Linux... 

若输出为 data 或 application/octet-stream,说明文件头未被识别,需使用 binwalk 进行深度扫描。

使用 binwalk 扫描固件中的嵌入文件与文件系统特征:

binwalk firmware.bin

该命令会列出文件偏移量、描述与可能的文件系统签名。若需要提取嵌入内容,执行:

binwalk -e firmware.bin

提取结果默认保存在 _firmware.bin.extracted 目录中。

当 binwalk 识别出 SquashFS、JFFS2、CramFS 等文件系统时,可进一步确认架构。例如识别到 SquashFS 后,使用 binwalk -A 查看 CPU 架构信息:

binwalk -A firmware.bin

验证方法与判定标准

  • 类型识别成功:file 或 binwalk 输出中明确包含以下任一信息:Linux kernel、uImage、filesystem、SquashFS、JFFS2、gzip compressed 等,而非仅返回 data。
  • 架构识别成功:输出中出现 ARM、MIPS、x86、RISC-V 等架构关键字。
  • 文件系统提取验证:若固件包含文件系统,执行 binwalk -e 后,在 _firmware.bin.extracted 目录下能看到非空的文件系统目录(如 squashfs-root),且其中包含 /bin、/etc 等典型 Linux 目录结构。

常见问题

  • binwalk 输出大量偏移地址但无文件系统:可能固件经过加密或自定义压缩,需结合 binwalk -E(熵分析)判断是否有加密段。
  • file 识别为 data:不代表固件无效,多数 IoT 固件直接为裸二进制,需依赖 binwalk 的签名扫描。
  • 提取失败:若 binwalk -e 报错,尝试 binwalk -Me 递归提取,或手动使用 dd 按偏移量切割后单独分析。

完成上述识别后,即可确定固件的基本类型与目标平台,为后续逆向分析(如提取文件系统、定位漏洞)建立基础。