4、Binwalk深度解析:安装与编译、固件扫描、文件提取、熵分析、签名识别
Binwalk,这玩意儿可以说是固件逆向的瑞士军刀。我入行那会儿,还没这么趁手的工具,都是拿十六进制编辑器硬啃。后来Binwalk一出来,整个圈子都炸了——原来固件分析可以这么爽。
今天咱们就把它掰开揉碎了讲。从安装编译,到扫描提取,再到熵分析和签名识别,一条龙走完。
4.1 安装与编译:别踩我踩过的坑
Binwalk的安装,说简单也简单,说坑也坑。我建议你直接用源码编译,别图省事用pip装旧版。
正确的姿势是这样的:
# 克隆最新源码
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
# 安装依赖
sudo apt-get install python3-pip
sudo pip3 install -r requirements.txt
# 编译安装
sudo python3 setup.py install
# 验证安装
binwalk --help
嗯,这里要注意。如果你搞IoT固件,一定要装额外的解压工具:
# 安装sasquatch(SquashFS支持)
sudo apt-get install build-essential liblzma-dev liblzo2-dev zlib1g-dev
git clone https://github.com/devttys0/sasquatch
cd sasquatch
./build.sh
# 安装jefferson(JFFS2支持)
sudo pip3 install jefferson
为什么非要装这些?我遇到过一台路由器,固件用SquashFS打包,没装sasquatch直接报错。你想想看,卡在这种地方多冤。
4.2 固件扫描:第一眼就看透它
拿到一个固件,我习惯先跑个快速扫描。就像医生看病先量体温一样。
binwalk firmware.bin
输出结果会告诉你:这个固件里藏了哪些东西。比如:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 TRX firmware header, little endian, image size: 8388608
64 0x40 LZMA compressed data, properties: 0x5D
2621440 0x280000 SquashFS filesystem, little endian, version 4.0
...
看到没?TRX头、LZMA压缩、SquashFS文件系统,一目了然。我个人习惯先看文件系统偏移,这往往是固件的核心。
binwalk -M firmware.bin
4.3 文件提取:把固件拆成零件
扫描完了,下一步就是提取。说白了就是把固件里的文件系统、内核、驱动啥的都拆出来。
# 自动提取所有文件
binwalk -e firmware.bin
# 指定提取到某个目录
binwalk -e -C ./output firmware.bin
# 递归提取(对付多层打包的固件)
binwalk -Me firmware.bin
提取完成后,你会得到一个文件夹。里面通常有:
- squashfs-root/ — 文件系统,最值钱的部分
- _firmware.bin.extracted/ — 其他提取出的碎片
我记得有一次分析某品牌摄像头固件,提取出来发现文件系统里有个隐藏的调试脚本。那个脚本暴露了后门端口。嗯,这种惊喜在固件逆向里很常见。
4.4 熵分析:判断加密和压缩的利器
熵分析,听起来高大上,其实原理很简单。它衡量数据的随机程度。
- 高熵(接近8.0):通常是加密数据或压缩数据
- 低熵(接近0):通常是明文、代码、文件系统
- 中等熵(4-6):可能是混合区域
用Binwalk做熵分析:
# 生成熵图
binwalk -E firmware.bin
# 保存熵图为PNG
binwalk -E -J firmware.bin
你会得到一张图,横轴是偏移地址,纵轴是熵值。我一般这么看:
| 熵值区间 | 可能含义 | 我的处理方式 |
|---|---|---|
| 0.0 - 2.0 | 空白区域或固定数据 | 跳过,不浪费时间 |
| 2.0 - 5.0 | 代码或文件系统 | 重点关注,提取分析 |
| 5.0 - 7.5 | 压缩数据 | 尝试解压,找算法 |
| 7.5 - 8.0 | 加密数据 | 准备硬啃,或者放弃 |
为什么会这样?因为加密算法会让数据分布非常均匀,熵值自然就高。压缩算法虽然也高,但通常会有一些结构特征。
4.5 签名识别:Binwalk的看家本领
Binwalk之所以强大,全靠它的签名库。它内置了上千种文件头和压缩算法的签名。
你可以自定义签名,这是进阶玩法:
# 查看内置签名
binwalk --signature-list
# 自定义签名文件(magic文件)
# 格式:文件类型 偏移量 签名值
# 示例:
# my_custom_fs 0x0 12345678 AABBCCDD
# 使用自定义签名
binwalk -m my_magic.bin firmware.bin
我经常自己写签名。比如某厂商喜欢在固件开头加个自定义头,Binwalk不认识。那我就自己写个magic规则:
# 自定义签名示例
# 厂商XYZ的固件头
0 string XYZF XYZ Firmware Header
64 string KRNL Linux Kernel Image
1024 string ROOT SquashFS Filesystem
你想想看,有了这个能力,什么固件在你面前都是透明的。
binwalk -y "filesystem" firmware.bin可以只搜索文件系统相关的签名。省时间。
4.6 知识体系总览
说了这么多,咱们用一张图把Binwalk的核心能力串起来:
这张图把Binwalk的五大模块串起来了。你从安装开始,到扫描、提取、分析,最后用签名识别收尾,一条完整的固件逆向流水线。
好了,Binwalk的核心内容就这些。记住,工具只是工具,真正值钱的是你分析固件的思路和经验。多动手,多踩坑,慢慢就熟了。
公众号:蓝海资料掘金营,微信deep3321