第4章:Binwalk深度使用:特征扫描、文件提取、熵值分析、自定义签名
各位好,我是老周。今天咱们聊聊Binwalk这个工具。
说实话,做固件分析这么多年,Binwalk是我最离不开的工具之一。它就像一把瑞士军刀——功能多,但很多人只用了个皮毛。我记得刚入行那会儿,以为Binwalk就是个文件提取器,后来才发现,这玩意儿深度用起来,能帮你省下大把时间。
4.1 特征扫描:固件里的“指纹识别”
Binwalk最基础的功能,就是特征扫描。说白了,它会在固件二进制文件里,寻找各种已知文件格式的“魔法头”。
什么是魔法头?就是文件开头的几个特定字节。比如JPEG图片开头是FF D8 FF,ZIP压缩包开头是50 4B 03 04。Binwalk内置了一个庞大的签名库,能识别上百种文件格式。
我习惯这么用:
binwalk firmware.bin
这条命令会扫描整个固件,列出所有匹配到的签名。输出结果会告诉你:偏移地址、文件类型、描述信息。
举个例子,我曾经分析一台思科交换机的固件,跑完Binwalk后,发现里面嵌了三个文件系统:一个SquashFS、一个JFFS2,还有一个神秘的RAW分区。如果没有特征扫描,你根本不知道固件里藏着这么多东西。
核心要点:特征扫描是固件分析的“第一眼印象”。它能快速告诉你固件里有什么,省去手动翻二进制文件的痛苦。
4.2 文件提取:把固件“拆开”看
扫描完了,下一步就是提取。Binwalk的提取功能非常强大,一条命令就能把固件里所有可识别的文件都拆出来。
binwalk -e firmware.bin
加上-e参数,Binwalk会自动提取所有匹配到的文件。它会创建一个以固件名命名的文件夹,里面按偏移地址存放着提取出来的文件。
我个人更常用的是--dd参数,它能让你指定提取特定类型的文件:
binwalk -D 'squashfs:rootfs:squashfs' firmware.bin
这条命令的意思是:只提取SquashFS文件系统,保存为rootfs.squashfs。为什么这么做?因为有时候固件里文件太多,全提取出来反而乱。我只关心文件系统,那就只提取它。
小技巧:提取完成后,记得用file命令检查一下提取出来的文件。有时候Binwalk会误判,多一步验证总没错。
4.3 熵值分析:看固件的“混乱程度”
熵值分析,这个概念听起来高大上,其实很简单。熵值衡量的是数据的随机性。高熵值(接近8.0)意味着数据看起来像随机数,通常是加密或压缩过的。低熵值(接近0)意味着数据有规律,可能是明文代码或未压缩的数据。
Binwalk的熵值分析命令:
binwalk -E firmware.bin
它会生成一个熵值图,用ASCII字符画出来。你一眼就能看出固件里哪些区域是加密的,哪些是明文的。
我记得有一次分析一个路由器固件,特征扫描什么都没找到。我差点以为固件是加密的。后来跑了一下熵值分析,发现整个固件的熵值都在7.5以上——嗯,果然是加密了。后来我花了两天时间逆向它的解密算法,才把固件解开。
注意:高熵值不一定代表加密。压缩过的数据熵值也很高。要区分加密和压缩,需要结合其他信息,比如文件头、上下文等。
熵值分析还有一个高级用法:对比不同版本的固件。把两个版本的熵值图叠在一起看,能快速发现哪些区域发生了变化。这在分析固件更新包时特别有用。
4.4 自定义签名:让Binwalk认识你的文件
Binwalk内置的签名库很全,但总有它不认识的东西。比如某些厂商自定义的固件头、私有文件格式。这时候,就需要自定义签名了。
自定义签名的格式很简单,写在文本文件里,每行一条:
# 格式:偏移 描述 签名
0x0 思科自定义头 \xAB\xCD\xEF\x01
0x100 私有文件系统 \xDE\xAD\xBE\xEF
然后加载这个签名文件:
binwalk -m my_signatures.txt firmware.bin
我曾经分析过一个工业交换机的固件,厂商用了自己的打包格式。Binwalk默认扫不出来。我花了半天逆向它的打包逻辑,写了一个自定义签名。从那以后,这个固件在我眼里就是透明的了。
自定义签名有几个要点:
- 签名要足够独特:别用太短的签名,容易误匹配。我一般用4字节以上。
- 偏移要准确:签名在文件中的位置,写错了就匹配不到。
- 描述要清晰:方便以后自己看,也方便团队其他人用。
4.5 实战:一个完整的分析流程
说了这么多,咱们来走一遍完整的流程。假设你拿到一个思科路由器的固件,叫c8800-universalk9.16.12.10.SPA.bin。
第一步,特征扫描:
binwalk c8800-universalk9.16.12.10.SPA.bin
输出会告诉你,这个固件包含一个SquashFS文件系统,还有一些配置文件。
第二步,熵值分析:
binwalk -E c8800-universalk9.16.12.10.SPA.bin
熵值图显示,文件系统区域的熵值在6.0左右,说明是压缩过的。固件头区域的熵值很低,说明是明文。
第三步,提取文件系统:
binwalk -D 'squashfs:rootfs:squashfs' c8800-universalk9.16.12.10.SPA.bin
提取出来的rootfs.squashfs,再用unsquashfs解压,就能看到完整的文件系统了。
第四步,如果遇到Binwalk不认识的格式,就写自定义签名。比如厂商自定义的配置头,格式是CFG\x01,那就加一条:
0x0 思科配置头 \x43\x46\x47\x01
然后重新扫描。
总结一下:特征扫描是“看”,熵值分析是“测”,文件提取是“拆”,自定义签名是“补”。四步走完,固件在你面前基本就是透明的了。
4.6 知识体系图
下面这张图,是我自己整理的Binwalk使用知识体系。你可以把它当成一个思维导图,快速回顾本章内容。
嗯,这张图把Binwalk的核心功能串起来了。你从中心出发,沿着四个方向走,每个方向都有具体的操作和技巧。记住这个框架,以后分析固件就不会手忙脚乱了。
避坑指南:我曾经因为没做熵值分析,直接去提取一个加密固件,结果提取出一堆乱码文件。浪费了整整一天。后来我养成了习惯:先跑熵值,再决定下一步。这个习惯帮我省了无数时间。
好了,Binwalk的深度使用就讲到这里。工具是死的,人是活的。多练、多用、多总结,你也能成为固件分析的老手。
公众号:蓝海资料掘金营,微信deep3321