4、固件提取工具:Binwalk的源码编译与安装、固件解包实战

说到固件逆向,Binwalk 绝对是我工具箱里最趁手的家伙。没有之一。

你可能在网上见过各种一键安装的教程,apt-get install binwalk 就完事了。但我得说,真正干活的时候,源码编译才是王道。为什么?因为发行版里的 Binwalk 版本往往落后半年到一年,而固件格式这东西,厂商更新得比翻书还快。

4.1 为什么非要源码编译?

我踩过这个坑。有一次分析一台思科交换机的新固件,apt 装的 Binwalk 直接报错,解出来全是乱码。折腾了两天,最后发现是旧版本不支持新版 squashfs 的压缩算法。从那以后,我所有逆向环境里的 Binwalk 都是源码编译的。

源码编译的好处很明显:

  • 你能拿到最新的特征库和插件
  • 可以自己打补丁,修 bug
  • 编译时能控制依赖版本,避免冲突

核心观点: 逆向工程里,工具链的版本控制比你想的重要得多。一个过时的 Binwalk,可能让你多花三天时间。

4.2 编译前的环境准备

嗯,这里要注意。Binwalk 依赖不少 Python 库和系统工具。我建议你用一个干净的 Ubuntu 20.04 或 22.04 虚拟机来做。

先装基础依赖:

sudo apt-get update
sudo apt-get install -y build-essential autoconf automake libtool
sudo apt-get install -y python3 python3-pip python3-dev
sudo apt-get install -y git wget unzip

然后是固件解包需要的核心工具:

sudo apt-get install -y zlib1g-dev liblzma-dev liblzo2-dev
sudo apt-get install -y libssl-dev libcrypto++-dev
sudo apt-get install -y mtd-utils

我个人习惯把这些依赖写到一个脚本里,每次搭建新环境直接跑一遍。省心。

4.3 源码编译 Binwalk

从 GitHub 拉代码:

git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk

编译安装分两步:

# 第一步:编译 C 扩展模块
python3 setup.py build

# 第二步:安装到系统
sudo python3 setup.py install

装完之后验证一下:

binwalk --version

你应该能看到类似这样的输出:

Binwalk v2.3.3
Craig Heffner, ReFirm Labs
https://github.com/ReFirmLabs/binwalk

小技巧: 如果你在编译时遇到 "fatal error: Python.h: No such file or directory",说明没装 python3-dev。别慌,回去补上就行。

4.4 安装可选依赖(强烈推荐)

Binwalk 的很多高级功能需要额外工具。我建议你一次性装好:

# 解包 squashfs 文件系统
sudo apt-get install -y squashfs-tools

# 解包 jffs2 文件系统
sudo apt-get install -y mtd-utils

# 解包 ubifs 文件系统
sudo apt-get install -y u-boot-tools

# 解包 cramfs 文件系统
sudo apt-get install -y cramfsprogs cramfsswap

# 解包 yaffs2 文件系统
sudo apt-get install -y yaffs2utils

这些工具不装,Binwalk 也能跑,但遇到某些固件会直接跳过,不报错也不提示。我曾经因为这个漏掉了一个关键的配置文件,排查了整整一天。

4.5 固件解包实战:TP-Link 模拟固件

好,工具装好了,咱们来点真格的。我准备了一个 TP-Link 的模拟固件(你可以在网上找到类似的测试固件)。

先看看固件的基本信息:

binwalk -B wr841nv8.bin

输出大概长这样:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             TP-Link firmware header, image size: 3932160 bytes, ...
131072        0x20000         LZMA compressed data, properties: 0x5D, ...
1052672       0x101000        Squashfs filesystem, little endian, version 4.0, ...

看到没?Binwalk 自动识别出了固件的结构:TP-Link 头部、LZMA 压缩数据、Squashfs 文件系统。

现在开始解包:

binwalk -Me wr841nv8.bin

-M 参数是递归解包,-e 是提取。跑完之后,当前目录下会生成一个 _wr841nv8.bin.extracted 文件夹。

进去看看:

cd _wr841nv8.bin.extracted
ls -la

你会看到一堆文件,其中最重要的是 squashfs-root 目录。进去就是完整的文件系统:

cd squashfs-root
ls

常见的目录结构:

  • /bin - 二进制程序
  • /sbin - 系统管理程序
  • /etc - 配置文件
  • /lib - 库文件
  • /usr - 用户程序
  • /www - Web 管理界面

注意: 有些固件会做加密或混淆。如果 Binwalk 解出来全是乱码,别急着怀疑工具。先看看固件头部有没有加密标记。TP-Link 有些新固件用了 XOR 加密,需要先解密再解包。

4.6 固件解包实战:思科模拟固件

思科的固件结构跟 TP-Link 不太一样。咱们拿一个思科交换机的模拟固件来练手:

binwalk -B cisco_switch.bin

输出示例:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Cisco IOS image, version 15.2(4)M, ...
262144        0x40000         LZMA compressed data, properties: 0x5D, ...
524288        0x80000         Squashfs filesystem, little endian, version 4.0, ...

思科固件的特点:

  • 头部信息更丰富,包含版本、平台、校验和
  • 经常有多层压缩和嵌套
  • 文件系统可能是 squashfs 或 ubifs

解包命令一样:

binwalk -Me cisco_switch.bin

解完之后,重点关注这几个地方:

  • /etc/passwd - 用户密码(通常是 hash)
  • /etc/config - 网络配置
  • /bin/ 下的二进制文件 - 可以扔进 IDA 分析
  • /lib/ 下的库文件 - 看看有没有自定义加密

经验之谈: 思科固件里经常藏着调试接口和后门。我曾在 /bin/ 目录下发现一个叫 debug_tool 的二进制,直接给了 root shell。厂商说这是"测试用",你信吗?

4.7 解包后的常见问题与处理

实战中你可能会遇到这些情况:

问题 原因 解决方法
解出来只有几个文件 固件被加密或压缩层数不够 检查头部,尝试手动指定偏移
squashfs 解包失败 版本不匹配或使用了非标准压缩 安装对应版本的 squashfs-tools
文件系统挂载不上 固件是 ubifs 格式 用 ubireader 工具
解出来的文件全是 0 固件被截断或损坏 重新下载固件,检查 MD5

我曾经遇到过一个 TP-Link 固件,Binwalk 怎么都解不出来。后来手动看了十六进制,发现厂商在固件头部塞了 256 字节的垃圾数据。用 dd 命令跳过去就好了:

dd if=firmware.bin of=clean.bin bs=1 skip=256
binwalk -Me clean.bin

4.8 本章知识体系

下面这张图总结了 Binwalk 源码编译到固件解包的完整流程:

Binwalk 源码编译与固件解包流程 阶段一:环境准备 安装 build-essential | python3-dev | zlib1g-dev | squashfs-tools 等依赖 阶段二:源码编译 git clone → python3 setup.py build → sudo python3 setup.py install 阶段三:固件分析 binwalk -B 识别结构 | binwalk -Me 递归解包 | 提取文件系统 验证:检查 /bin /etc /lib /www 等关键目录 TP-Link 固件:关注 /www 和 /etc 目录 思科固件:关注 /bin 和 /lib 目录

这张图把整个流程串起来了。从环境准备到源码编译,再到固件分析和结果验证,每一步都有它的意义。你按这个顺序走,基本不会出大问题。

好了,Binwalk 的编译安装和实战就讲到这里。工具链搭好了,下一章咱们聊聊怎么用 IDA Pro 分析解包出来的二进制文件。那才是真正有意思的部分。


公众号:蓝海资料掘金营,微信deep3321