3、固件获取与识别:从官网、设备、OTA包获取固件;使用file、binwalk识别固件类型
做固件安全分析,第一步就是拿到固件。听起来简单,对吧?但这里面的门道其实不少。我刚开始做这行的时候,就曾在一个路由器固件上卡了整整两天——不是因为分析不了,而是因为我压根没找对固件版本。
今天咱们就聊聊,怎么把固件搞到手,以及拿到手之后怎么确认它到底是什么东西。
3.1 固件获取的三大途径
固件这东西,不像普通软件那样随便搜就能下。它藏在各个地方,得靠经验去找。我个人习惯把获取途径分成三类:官网、设备本身、OTA包。
3.1.1 从官网获取
这是最正规、也最省事的途径。大部分厂商都会在官网提供固件下载,尤其是路由器、摄像头、智能家居这类设备。
找固件的时候,我一般会去这几个地方翻:
- 支持中心:通常叫“下载中心”、“固件升级”、“技术支持”之类的名字
- 产品页面:有些厂商把固件藏在产品详情页的最底下
- 开发者社区:像小米、TP-Link都有开发者专区,里面会有历史版本
举个例子,去TP-Link官网下载某款路由器的固件,路径大概是:
官网 → 支持中心 → 输入型号 → 选择固件版本 → 下载.bin文件
但要注意,有些厂商的官网做得稀烂,搜索功能基本是摆设。这时候怎么办?直接去Google搜“设备型号 + firmware download”,往往比官网自带的搜索好用。
3.1.2 从设备中提取
官网找不到?或者厂商已经停止支持了?那就得从设备本身下手。
从设备提取固件,常见的方法有:
- 通过UART/SPI接口读取:拆机,找到Flash芯片,用编程器直接读
- 通过SSH/Telnet导出:如果设备有调试接口,直接连上去把固件dump出来
- 通过Web管理界面备份:有些设备提供“备份配置”功能,里面可能包含完整固件
我记得有一次,一个客户拿了个工业路由器过来,官网早就倒闭了。我拆开一看,用的是Winbond的25Q128 Flash芯片。拿编程器一读,16MB的固件就出来了。嗯,这种时候你会觉得,硬件提取虽然麻烦,但确实管用。
3.1.3 从OTA包中捕获
OTA(Over-The-Air)升级包,是现在最主流的固件分发方式。手机、智能音箱、摄像头,基本都是通过OTA升级的。
捕获OTA包的方法:
- 抓包拦截:用Wireshark或Burp Suite抓取设备升级时的网络流量
- 逆向升级APP:很多设备用手机APP升级,可以反编译APP找到下载地址
- 监听系统日志:设备升级时会在日志里打印下载链接,通过adb或串口就能看到
举个例子,抓取某品牌智能摄像头的OTA包:
1. 电脑开热点,让摄像头连上来
2. 用Wireshark抓取所有HTTP/HTTPS流量
3. 在APP里点击“检查更新”
4. 过滤出包含“.bin”或“.img”的请求
5. 复制下载链接,直接下载
关键点:OTA包有时候是加密的。厂商会把固件加密后再下发,防止被中间人篡改。这时候你拿到的就是加密后的数据,需要先解密才能分析。我后面会专门讲固件解密的方法。
3.2 固件识别:拿到手后先别急着分析
好,固件到手了。然后呢?直接扔进binwalk?别急。
我见过太多新手,拿到一个.bin文件就以为它是文件系统,结果解出来一堆乱码。其实,固件文件有很多种类型,你得先搞清楚它到底是什么。
3.2.1 用file命令快速识别
file命令是Linux系统自带的工具,能快速判断文件类型。用法极其简单:
file firmware.bin
输出结果大概长这样:
firmware.bin: u-boot legacy uImage, Linux Kernel Image, ...
或者:
firmware.bin: Squashfs filesystem, little endian, version 4.0, ...
再或者:
firmware.bin: data
看到“data”的时候就要小心了。这说明file命令认不出来,可能是加密了,或者是某种自定义格式。
3.2.2 用binwalk深度扫描
binwalk是固件分析的神器。它能扫描固件中的各种文件签名,找出隐藏的文件系统、内核、引导程序等。
基本用法:
binwalk firmware.bin
输出结果:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 u-boot legacy uImage, Linux Kernel Image
131072 0x20000 Squashfs filesystem, little endian, version 4.0
4194304 0x400000 JFFS2 filesystem, little endian
看到没?binwalk把固件里的各个部分都标出来了。偏移地址、大小、类型,一目了然。
如果想直接提取文件系统,用:
binwalk -e firmware.bin
它会自动把识别出来的内容解压到当前目录。
3.3 常见固件类型一览
做多了你就会发现,固件类型其实就那么几种。我整理了一个表格,方便你对照:
| 固件类型 | 常见后缀 | 特点 | 常见设备 |
|---|---|---|---|
| SquashFS | .bin, .img | 只读压缩文件系统,体积小 | 路由器、摄像头 |
| JFFS2 | .img, .jffs2 | 可读写,支持NAND Flash | 工业设备、嵌入式Linux |
| UBIFS | .ubi, .img | 新一代Flash文件系统 | 高端路由器、手机 |
| CramFS | .img, .cramfs | 老式压缩文件系统 | 老旧设备 |
| TRX | .trx | Broadcom路由器专用格式 | 华硕、Linksys路由器 |
| Intel HEX | .hex | 纯文本格式,用于单片机 | MCU、IoT设备 |
你想想看,如果你拿到一个SquashFS的固件,却用解压JFFS2的方法去处理,那肯定不行。所以,识别这一步真的很关键。
3.4 实战:一个完整的固件获取与识别流程
光说不练假把式。咱们走一遍完整的流程,拿一个虚拟的路由器固件做例子。
第一步:获取固件
假设我们要分析TP-Link WR841N V9的固件。先去官网下载中心,输入型号,找到V9版本,下载下来得到一个wr841nv9.bin文件。
第二步:初步识别
$ file wr841nv9.bin
wr841nv9.bin: data
嗯?显示“data”?别慌,这很正常。TP-Link的固件头部有自定义的引导头,file命令认不出来。
第三步:深度扫描
$ binwalk wr841nv9.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 TP-Link firmware header, ...
131072 0x20000 u-boot legacy uImage, Linux Kernel Image
262144 0x40000 Squashfs filesystem, little endian, version 4.0
看到了吧?binwalk识别出了TP-Link的头部、u-boot引导程序,以及SquashFS文件系统。
第四步:提取文件系统
$ binwalk -e wr841nv9.bin
执行完后,当前目录会多出一个_wr841nv9.bin.extracted文件夹,里面就是解压出来的文件系统。
核心思路:固件获取与识别,说白了就是“找得到、认得出”。找得到靠经验,认得出靠工具。但工具只是辅助,真正值钱的是你对固件结构的理解。
3.5 本章知识体系
下面这张图,帮你把本章的核心逻辑串起来:
这张图把本章的核心逻辑串起来了。从上到下,先获取固件,再识别类型,最后确认文件系统格式。每一步都有对应的工具和方法。
好了,固件获取与识别就讲到这里。记住一句话:拿到固件只是开始,认清楚它是什么,你才能知道下一步该怎么分析。别急着上手,先花几分钟把固件类型搞清楚,后面能省你几个小时甚至几天的时间。
公众号:蓝海资料掘金营,微信deep3321