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 的编译安装和实战就讲到这里。工具链搭好了,下一章咱们聊聊怎么用 IDA Pro 分析解包出来的二进制文件。那才是真正有意思的部分。
公众号:蓝海资料掘金营,微信deep3321