Binwalk 使用手册(固件分析与文件提取)

免责声明:本手册仅用于合法的安全研究、CTF 竞赛和授权的固件分析。未经授权分析他人设备固件可能违法。

1. 概述

Binwalk 是一个专门用于固件分析和文件提取的工具,由 Craig Heffner 开发。它能够:

  • 识别文件签名:扫描二进制文件中的嵌入文件和文件系统

  • 自动提取文件:递归提取嵌入的压缩包、文件系统和固件镜像

  • 熵分析:检测加密、压缩和随机数据

  • 固件解包:支持各种固件格式(UBI、JFFS2、SquashFS 等)

适用场景

  • CTF MISC 题目(文件隐写、嵌入文件)

  • IoT 固件逆向分析

  • 文件格式分析与数据恢复

  • 隐写分析(图片、音频中隐藏数据)

版本信息:本手册基于 Binwalk v2.3.0+


2. 安装方法

macOS 安装

# 使用 Homebrew 安装
brew install binwalk

# 验证安装
binwalk --help

# 安装额外依赖(完整功能)
brew install p7zip squashfs

# Python 依赖
pip3 install binwalk

Kali Linux / Debian / Ubuntu

# Kali 自带,如需更新
sudo apt update
sudo apt install binwalk

# 安装额外工具(用于提取更多格式)
sudo apt install mtd-utils gzip bzip2 tar arj lhasa p7zip \
  p7zip-full cabextract cramfsprogs cramfsswap squashfs-tools \
  sleuthkit default-jdk lzop srecord

从源码安装(最新版本)

# 克隆仓库
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk

# 安装
sudo python3 setup.py install

# 安装依赖
sudo ./deps.sh

3. 基本命令结构

binwalk [选项] [文件]

# 基本扫描
binwalk firmware.bin

# 提取文件
binwalk -e firmware.bin

# 递归提取
binwalk -Me firmware.bin

核心选项说明

扫描选项

  • -B / --signature - 扫描常见文件签名(默认)

  • -R / --raw=<string> - 搜索原始字符串

  • -A / --opcodes - 扫描可执行代码

  • -E / --entropy - 计算熵值(检测加密/压缩)

提取选项

  • -e / --extract - 自动提取已识别文件

  • -M / --matryoshka - 递归提取(俄罗斯套娃模式)

  • -D / --dd=<type:ext:cmd> - 自定义提取规则

  • --run-as=root - 以 root 权限运行(某些文件系统需要)

输出选项

  • -v / --verbose - 显示详细信息

  • -q / --quiet - 安静模式

  • -C / --directory=<dir> - 指定提取目录

  • -o / --offset=<offset> - 从指定偏移开始扫描

  • -l / --length=<length> - 扫描指定长度

过滤选项

  • -y / --include-invalid - 显示无效结果

  • -I / --show-invalid - 仅显示无效结果

  • -x / --exclude=<filter> - 排除特定签名


4. 核心功能详解

4.1 文件签名扫描

Binwalk 内置 500+ 文件签名,包括:

  • 压缩格式:ZIP、GZIP、BZIP2、LZMA、7Z

  • 文件系统:ext2/3/4、JFFS2、CRAMFS、SquashFS、YAFFS2、UBI

  • 图像格式:JPEG、PNG、GIF、BMP

  • 音视频:MP3、AVI、MP4

  • 固件:U-Boot、ARM/MIPS 代码、Android Boot

查看支持的签名

binwalk -B --list

4.2 熵分析

熵值范围:0(完全有序) - 1(完全随机)

  • 低熵(0-0.3):纯文本、重复数据

  • 中熵(0.3-0.7):普通文件(代码、文档)

  • 高熵(0.7-1.0):加密数据、压缩数据、随机数据

用途

  • 检测加密区域

  • 识别压缩算法

  • 发现隐藏数据

4.3 自动提取

提取模式

  • 单层提取(-e):仅提取直接识别的文件

  • 递归提取(-M):逐层解包,直到无法继续提取

提取目录结构

_firmware.bin.extracted/
├── 0.zip           # 偏移 0 处的 ZIP 文件
├── 1000.gzip       # 偏移 1000 处的 GZIP 文件
├── _0.zip.extracted/  # ZIP 内容
└── ...

5. 常用命令与示例

5.1 基本扫描

扫描文件签名

binwalk firmware.bin

输出示例

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JPEG image data
54272         0xD400          PNG image
131072        0x20000         gzip compressed data
262144        0x40000         Squashfs filesystem

详细扫描(显示更多信息)

binwalk -v firmware.bin

5.2 文件提取

自动提取(单层)

binwalk -e firmware.bin

递归提取(完全解包)

binwalk -Me firmware.bin
  • -M = --matryoshka(俄罗斯套娃模式)

  • 会自动解压 ZIP、GZIP、TAR 等,并继续扫描内层文件

指定提取目录

binwalk -e -C /tmp/extracted firmware.bin

5.3 熵分析

生成熵图

binwalk -E firmware.bin

保存熵图为 PNG

binwalk -E -J firmware.bin
  • 生成 firmware.bin.png

  • 高熵区域(加密/压缩)显示为波动

  • 低熵区域(文本/重复数据)显示为平坦

结合签名扫描和熵分析

binwalk -B -E firmware.bin

5.4 搜索特定字符串

搜索原始字符串

binwalk -R "flag{" challenge.bin

搜索十六进制模式

binwalk -R "\x89PNG" image.bin

5.5 自定义提取规则

提取特定类型文件

# 提取所有 JPEG 图片
binwalk -D 'jpeg:jpg' firmware.bin

# 提取 PNG 图片
binwalk -D 'png:png' firmware.bin

# 提取 ZIP 文件并执行自定义命令
binwalk -D 'zip:zip:unzip %e' firmware.bin

格式说明

-D '<类型>:<扩展名>:<命令>'
  • <类型>:签名类型(如 jpeg、png、zip)

  • <扩展名>:保存文件的扩展名

  • <命令>:提取后执行的命令(%e 代表提取的文件)

5.6 扫描特定偏移范围

从指定偏移开始

binwalk -o 1024 firmware.bin

扫描指定长度

binwalk -o 1024 -l 4096 firmware.bin
  • 从偏移 1024 开始,扫描 4096 字节


6. 文件签名识别

6.1 常见文件签名(Magic Bytes)

文件类型

十六进制签名

偏移

JPEG

FF D8 FF

0

PNG

89 50 4E 47

0

GIF

47 49 46 38

0

ZIP

50 4B 03 04

0

GZIP

1F 8B 08

0

BZIP2

42 5A 68

0

7Z

37 7A BC AF 27 1C

0

ELF (Linux)

7F 45 4C 46

0

PDF

25 50 44 46

0

RAR

52 61 72 21

0

6.2 固件特定签名

类型

签名

描述

U-Boot

27 05 19 56

U-Boot uImage

Squashfs

68 73 71 73 / 73 71 73 68

Squashfs 文件系统

JFFS2

19 85 / 85 19

JFFS2 文件系统

CRAMFS

45 3D CD 28

CRAMFS 文件系统

YAFFS2

N/A

YAFFS2(无固定签名)

6.3 手动查看文件签名

使用 hexdump

hexdump -C firmware.bin | head -n 10

使用 xxd

xxd firmware.bin | head -n 20

使用 file 命令

file firmware.bin

7. CTF 常见场景

场景1:图片隐写(嵌入 ZIP)

题目特征:提供一张图片,但大小异常(几 MB)

解题步骤

# 1. 扫描图片
binwalk image.png

# 输出示例:
# DECIMAL       HEXADECIMAL     DESCRIPTION
# 0             0x0             PNG image
# 54321         0xD431          Zip archive data

# 2. 提取隐藏文件
binwalk -e image.png

# 3. 查看提取的内容
cd _image.png.extracted
ls

场景2:固件镜像解包

题目特征:提供固件文件(.bin/.img)

# 1. 扫描固件结构
binwalk firmware.bin

# 输出示例:
# 0             0x0             U-Boot uImage
# 131072        0x20000         LZMA compressed data
# 1048576       0x100000        Squashfs filesystem

# 2. 递归提取
binwalk -Me firmware.bin

# 3. 进入文件系统查找 flag
cd _firmware.bin.extracted/squashfs-root
grep -r "flag{" .

场景3:音频文件隐写

题目特征:提供音频文件(MP3/WAV)

# 1. 扫描音频文件
binwalk music.mp3

# 输出示例:
# 0             0x0             MP3 audio
# 2048000       0x1F4000        PNG image

# 2. 提取隐藏图片
binwalk -e music.mp3

# 3. 查看提取的图片
cd _music.mp3.extracted
open 1F4000.png

场景4:多层嵌套提取

题目特征:文件套娃(ZIP 套 GZIP 套 TAR)

# 使用 -M 递归提取
binwalk -Me nested.bin

# 自动完成所有解包,最终找到 flag
find _nested.bin.extracted -name "*flag*"

8. 实战案例

案例2:CTF - Misc 隐写题

题目:提供 challenge.jpg,提示”图片中有秘密”

# 1. 查看文件基本信息
file challenge.jpg
# Output: JPEG image data, JFIF standard 1.01

# 2. 检查文件大小(异常大)
ls -lh challenge.jpg
# Output: 3.5M (正常 JPEG 应该 <1MB)

# 3. Binwalk 扫描
binwalk challenge.jpg

# 输出:
# DECIMAL       HEXADECIMAL     DESCRIPTION
# 0             0x0             JPEG image data
# 156432        0x26310         Zip archive data, encrypted

# 4. 提取 ZIP
binwalk -e challenge.jpg

# 5. 破解 ZIP 密码(如果加密)
cd _challenge.jpg.extracted
fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt 26310.zip

# 6. 解压获取 flag
unzip 26310.zip
cat flag.txt

案例3:IoT 设备固件分析

目标:分析智能摄像头固件,查找默认密码

# 1. 扫描固件
binwalk camera_firmware.bin

# 输出:
# 0             0x0             U-Boot uImage
# 64            0x40            LZMA compressed data
# 2097152       0x200000        JFFS2 filesystem

# 2. 提取文件系统(需要 root 权限)
sudo binwalk -Me --run-as=root camera_firmware.bin

# 3. 查找配置文件
cd _camera_firmware.bin.extracted/jffs2-root
find . -name "*.conf"
find . -name "*.cfg"

# 4. 搜索敏感信息
grep -r "password" .
grep -r "admin" .
grep -r "default" .

# 5. 分析启动脚本
cat etc/init.d/rcS

9. 高级技巧

9.1 结合 dd 提取特定区域

场景:Binwalk 识别了文件,但自动提取失败

# 1. Binwalk 扫描获取偏移
binwalk firmware.bin
# 输出:131072  0x20000  Squashfs filesystem

# 2. 使用 dd 手动提取
dd if=firmware.bin of=squashfs.img bs=1 skip=131072

# 3. 挂载文件系统
mkdir /tmp/squashfs
sudo mount -t squashfs squashfs.img /tmp/squashfs

# 4. 分析内容
ls /tmp/squashfs

# 5. 卸载
sudo umount /tmp/squashfs

9.2 熵分析定位加密区域

# 1. 生成熵图
binwalk -E firmware.bin

# 2. 分析输出(查找高熵区域)
# 高熵区域(0.8+)可能是加密数据

# 3. 结合签名扫描验证
binwalk -B -E firmware.bin

# 4. 如果是加密,尝试识别算法(使用其他工具)

9.3 自定义签名

创建自定义签名文件

# 1. 创建签名文件 custom.magic
echo '0   string   CUSTOM   Custom file format' > custom.magic

# 2. 使用自定义签名
binwalk --magic=custom.magic firmware.bin

9.4 批量分析

批量扫描多个固件

#!/bin/bash
for firmware in *.bin; do
  echo "Analyzing $firmware..."
  binwalk "$firmware" > "${firmware}.report"
  binwalk -Me "$firmware"
done

10. 常见问题与排查

问题1:提取失败(Permission Denied)

错误信息WARNING: Extractor.execute failed to run external extractor

原因:某些文件系统需要 root 权限

解决方案

# 使用 sudo 并启用 --run-as=root
sudo binwalk -Me --run-as=root firmware.bin

问题2:识别了文件但未提取

原因:缺少对应的解压工具

解决方案

# macOS 安装额外工具
brew install p7zip squashfs

# Linux 安装
sudo apt install p7zip-full squashfs-tools cramfsswap mtd-utils

# 验证工具可用
which unsquashfs
which 7z

问题3:文件系统损坏

错误信息unsquashfs: Filesystem corruption detected

排查步骤

# 1. 确认偏移正确
binwalk firmware.bin

# 2. 手动提取到单独文件
dd if=firmware.bin of=fs.img bs=1 skip=<offset>

# 3. 使用文件系统专用工具修复
fsck.ext4 -f fs.img  # 对于 ext4
# 或
sudo unsquashfs -f fs.img  # 强制提取 Squashfs

问题4:识别错误(误报)

原因:随机数据碰巧匹配文件签名

解决方案

# 1. 使用 -y 显示无效结果
binwalk -y firmware.bin

# 2. 手动验证可疑偏移
xxd -s <offset> -l 64 firmware.bin

# 3. 结合熵分析
binwalk -B -E firmware.bin

11. 结合其他工具

11.1 与 Foremost 结合

Binwalk 用于扫描,Foremost 用于恢复

# 1. Binwalk 扫描
binwalk firmware.bin

# 2. Foremost 恢复删除的文件
foremost -i firmware.bin -o recovered/

# 3. 对比结果
diff -r _firmware.bin.extracted recovered/

11.2 与 7z 结合

处理复杂压缩包

# 1. Binwalk 提取
binwalk -e firmware.bin

# 2. 使用 7z 进一步解压
cd _firmware.bin.extracted
7z x -r *.zip
7z x -r *.7z

11.3 与 Strings 结合

查找文本线索

# 1. 提取可读字符串
strings firmware.bin > strings.txt

# 2. 搜索关键字
grep -i "password" strings.txt
grep -i "admin" strings.txt
grep -i "key" strings.txt

# 3. 结合 Binwalk 结果定位

11.4 与 Hexdump/xxd 结合

手动分析可疑区域

# 1. Binwalk 找到偏移
binwalk firmware.bin
# 输出:12345  0x3039  Suspicious data

# 2. 查看该区域十六进制
xxd -s 12345 -l 256 firmware.bin

# 3. 或使用 hexdump
hexdump -C -s 12345 -n 256 firmware.bin

12. 参考链接

官方资源

  • Binwalk GitHub:https://github.com/ReFirmLabs/binwalk

  • 官方 Wiki:https://github.com/ReFirmLabs/binwalk/wiki

  • 签名数据库:https://github.com/ReFirmLabs/binwalk/blob/master/src/binwalk/magic

固件分析资源

  • Firmware Analysis Toolkit (FAT):https://github.com/attify/firmware-analysis-toolkit

  • Firmwalker:https://github.com/craigz28/firmwalker

  • Firmware.re 数据库:https://www.firmware.re/

教程和文章

  • Binwalk 完整指南:https://www.refirmlabs.com/binwalk/

  • 固件逆向入门:https://www.pentestpartners.com/security-blog/

  • CTF Wiki - Misc:https://ctf-wiki.org/misc/archive/

相关工具

  • Foremost:https://github.com/korczis/foremost(文件恢复)

  • Scalpel:https://github.com/sleuthkit/scalpel(数据雕刻)

  • Firmware Mod Kit (FMK):https://github.com/rampageX/firmware-mod-kit

  • Jefferson:https://github.com/sviehb/jefferson(JFFS2 提取)


文件签名速查表

# 常用文件签名(Python 字典)
FILE_SIGNATURES = {
    'JPEG': b'\xFF\xD8\xFF',
    'PNG': b'\x89\x50\x4E\x47',
    'GIF': b'\x47\x49\x46\x38',
    'ZIP': b'\x50\x4B\x03\x04',
    'GZIP': b'\x1F\x8B\x08',
    'BZIP2': b'\x42\x5A\x68',
    '7Z': b'\x37\x7A\xBC\xAF\x27\x1C',
    'RAR': b'\x52\x61\x72\x21',
    'ELF': b'\x7F\x45\x4C\x46',
    'PDF': b'\x25\x50\x44\x46',
    'MP3': b'\xFF\xFB',
    'MP4': b'\x00\x00\x00\x18\x66\x74\x79\x70',
    'Squashfs': b'\x68\x73\x71\x73',
}

文档版本:v1.0 更新日期:2025-01 适用版本:Binwalk v2.3.0 - v2.4.0+