3. 固件获取与提取:从官网下载、从设备Flash芯片读取(编程器/SPI Flash)、从OTA升级包提取
做固件安全分析,第一步也是最关键的一步——你得先拿到固件。没有固件,后面全是空谈。
我这些年挖过的坑,有一半都栽在「固件拿错了」或者「提取不完整」上。你想想看,分析一个残缺的固件,就像拼图少了几块,结论能对吗?
这一章,我把固件获取的三种主流路径掰开揉碎讲清楚。嗯,都是实战经验,没有废话。
3.1 从官网下载:最省事,但别太天真
官网下载固件,听起来最简单。但这里头有门道。
我个人习惯,先翻厂商的「支持」或「下载中心」页面。大部分消费级路由器、智能家居设备,都会提供固件更新包。格式通常是 .bin、.trx、.img 或者 .zip。
我在项目中遇到过,某知名路由器厂商的官网,只保留最近两个版本。但通过修改URL中的版本号参数,居然能下载到三年前的固件。嗯,这种「目录遍历」式的漏洞,其实很常见。
下载后,第一步做什么?
- 校验哈希值:厂商通常会提供 MD5 或 SHA256。我建议你算一下,防止下载过程中被篡改。
- 检查文件头:用
binwalk或hexdump看一眼。如果是加密的固件,文件头会显示乱码或者特定的魔数。 - 解压试试:很多固件其实是多层打包的。先
binwalk -e跑一遍,看看能拆出什么。
# 我的常用命令
$ wget https://example.com/firmware/fw_v2.1.0.bin
$ md5sum fw_v2.1.0.bin
$ binwalk -Me fw_v2.1.0.bin
.bin 或 .img,经常能抓到隐藏的下载链接。
3.2 从设备Flash芯片读取:硬核玩家的必修课
官网下载不到?或者固件是加密的?那就只能从硬件下手了。
说白了,就是直接把 Flash 芯片里的内容读出来。这需要编程器,最常见的是 SPI Flash 编程器。
我刚开始做硬件逆向时,用的是一百多块的 CH341A 编程器。虽然便宜,但够用。后来项目多了,换了更专业的工具,比如 Dediprog 或 Xeltek。
3.2.1 准备工作
- 编程器:CH341A(入门)、Dediprog SF100(进阶)、Xeltek SuperPro(专业)
- 夹子或座子:SOP8/SOP16 夹子,或者直接焊下来用座子
- 软件:FlashROM、SPI Flash Tool、或者编程器自带的软件
- 万用表:确认引脚连接正确,别烧了芯片
3.2.2 读取步骤
- 断电:设备必须完全断电,最好拔掉电池和电源。
- 找到 Flash 芯片:PCB 上找 8 脚或 16 脚的芯片,丝印通常是
25Qxx、W25Qxx、MX25Lxx等。 - 连接编程器:用夹子夹住芯片,或者焊下来放到座子上。注意引脚顺序——芯片上有个小圆点,那是 1 脚。
- 识别芯片:打开编程器软件,点击「检测」或「识别」。软件会自动读出芯片型号和容量。
- 读取数据:点击「读取」,等待进度条走完。保存为
.bin文件。 - 校验:再读一遍,对比两次的哈希值。不一致就重来。
# 用 flashrom 命令行读取(Linux 下)
$ sudo flashrom -p ch341a_spi -r firmware_dump.bin
$ sudo flashrom -p ch341a_spi -v firmware_dump.bin # 校验
3.2.3 常见 Flash 芯片引脚定义
| 引脚 | 名称 | 功能 |
|---|---|---|
| 1 | CS# | 片选(低电平有效) |
| 2 | DO (MISO) | 数据输出 |
| 3 | WP# | 写保护 |
| 4 | GND | 地 |
| 5 | DI (MOSI) | 数据输入 |
| 6 | CLK | 时钟 |
| 7 | HOLD# | 保持 |
| 8 | VCC | 电源(1.8V/3.3V) |
3.3 从OTA升级包提取:空中抓取的艺术
有些设备,你根本拆不开——比如智能灯泡、某些 IoT 传感器。这时候,OTA 升级包就是你的救命稻草。
OTA 升级包通常通过 HTTPS 传输。怎么抓?
3.3.1 抓包方法
- 代理抓包:用 Burp Suite 或 mitmproxy 做中间人。前提是设备允许你配置代理,或者你能伪造证书。
- 路由器抓包:在路由器上开启 tcpdump,或者用 Wireshark 监听。过滤条件:
http or tls.handshake.type == 1。 - 日志分析:有些设备会把 OTA 下载链接写到系统日志里。通过串口或 SSH 登录设备,查看
/var/log下的文件。
# 在路由器上抓包
$ tcpdump -i br-lan -w ota_capture.pcap host 192.168.1.100
# 然后到 PC 上用 Wireshark 分析
3.3.2 提取与重组
抓到 OTA 包后,通常需要处理几个问题:
- 分片重组:如果升级包被分成多个 TCP 包或 MQTT 消息,需要按顺序拼接。
- 解密:很多 OTA 包是加密的。密钥可能硬编码在固件里,或者通过 RSA 交换。你需要先逆向客户端,找到解密逻辑。
- 解包:解密后,可能还是
.tar.gz、.squashfs或自定义格式。用binwalk或dd提取。
# 假设抓到的 OTA 包是加密的,先解密
$ openssl enc -aes-256-cbc -d -in encrypted_ota.bin -out decrypted_ota.bin -K 密钥 -iv 向量
# 然后解包
$ binwalk -Me decrypted_ota.bin
3.4 本章知识体系
下面这张图,是我自己梳理的固件获取路径。你跟着走,基本不会漏。
三条路径,各有优劣。官网下载最省事,但可能拿不到完整版本。Flash 读取最可靠,但需要硬件动手能力。OTA 提取最灵活,但抓包和解密环节容易卡住。
我个人建议:如果条件允许,三条路径都走一遍。交叉验证,确保你拿到的固件是完整的、未被篡改的。我在一个项目中,官网下载的固件和 Flash 读出来的固件,哈希值居然不一样——后来发现是厂商在 OTA 过程中打了补丁。嗯,这种「版本漂移」现象,只有对比才能发现。