3. 固件获取与提取:从官网下载、从设备Flash芯片读取(编程器/SPI Flash)、从OTA升级包提取

做固件安全分析,第一步也是最关键的一步——你得先拿到固件。没有固件,后面全是空谈。

我这些年挖过的坑,有一半都栽在「固件拿错了」或者「提取不完整」上。你想想看,分析一个残缺的固件,就像拼图少了几块,结论能对吗?

这一章,我把固件获取的三种主流路径掰开揉碎讲清楚。嗯,都是实战经验,没有废话。

3.1 从官网下载:最省事,但别太天真

官网下载固件,听起来最简单。但这里头有门道。

我个人习惯,先翻厂商的「支持」或「下载中心」页面。大部分消费级路由器、智能家居设备,都会提供固件更新包。格式通常是 .bin.trx.img 或者 .zip

关键点: 别只看最新版本。历史版本往往更有价值。厂商修复漏洞后,旧版本固件就是你的「漏洞金矿」。

我在项目中遇到过,某知名路由器厂商的官网,只保留最近两个版本。但通过修改URL中的版本号参数,居然能下载到三年前的固件。嗯,这种「目录遍历」式的漏洞,其实很常见。

下载后,第一步做什么?

  • 校验哈希值:厂商通常会提供 MD5 或 SHA256。我建议你算一下,防止下载过程中被篡改。
  • 检查文件头:用 binwalkhexdump 看一眼。如果是加密的固件,文件头会显示乱码或者特定的魔数。
  • 解压试试:很多固件其实是多层打包的。先 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
小技巧: 有些厂商会把固件藏在 CDN 上,但网页不直接显示。试试用浏览器的「开发者工具」→「网络」标签,刷新页面时过滤 .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、或者编程器自带的软件
  • 万用表:确认引脚连接正确,别烧了芯片
警告: 我曾经有一次,没仔细看芯片型号,直接用夹子夹上去。结果芯片是 1.8V 的,编程器输出 3.3V,直接冒烟了。嗯,从那以后,我每次都会先查数据手册,确认供电电压。

3.2.2 读取步骤

  1. 断电:设备必须完全断电,最好拔掉电池和电源。
  2. 找到 Flash 芯片:PCB 上找 8 脚或 16 脚的芯片,丝印通常是 25QxxW25QxxMX25Lxx 等。
  3. 连接编程器:用夹子夹住芯片,或者焊下来放到座子上。注意引脚顺序——芯片上有个小圆点,那是 1 脚。
  4. 识别芯片:打开编程器软件,点击「检测」或「识别」。软件会自动读出芯片型号和容量。
  5. 读取数据:点击「读取」,等待进度条走完。保存为 .bin 文件。
  6. 校验:再读一遍,对比两次的哈希值。不一致就重来。
# 用 flashrom 命令行读取(Linux 下)
$ sudo flashrom -p ch341a_spi -r firmware_dump.bin
$ sudo flashrom -p ch341a_spi -v firmware_dump.bin  # 校验
避坑指南: 我曾经遇到过,芯片被厂商设置了「读保护」。编程器能识别芯片,但读出来的全是 0xFF 或 0x00。这时候需要先解除保护,或者用更高级的编程器暴力读取。

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 分析
个人经验: 我遇到过一款智能摄像头,它的 OTA 升级包是通过 MQTT 协议下发的。抓 HTTP 根本没用。后来我分析了它的 MQTT 主题,才发现升级包被分片传输了。嗯,这种非标准做法,只能靠逆向客户端代码来破解。

3.3.2 提取与重组

抓到 OTA 包后,通常需要处理几个问题:

  1. 分片重组:如果升级包被分成多个 TCP 包或 MQTT 消息,需要按顺序拼接。
  2. 解密:很多 OTA 包是加密的。密钥可能硬编码在固件里,或者通过 RSA 交换。你需要先逆向客户端,找到解密逻辑。
  3. 解包:解密后,可能还是 .tar.gz.squashfs 或自定义格式。用 binwalkdd 提取。
# 假设抓到的 OTA 包是加密的,先解密
$ openssl enc -aes-256-cbc -d -in encrypted_ota.bin -out decrypted_ota.bin -K 密钥 -iv 向量
# 然后解包
$ binwalk -Me decrypted_ota.bin
注意: 有些厂商会在 OTA 包中加入「防回滚」机制。如果你提取的固件版本低于设备当前版本,刷回去可能会变砖。我建议你提取后先做分析,不要急着刷写。

3.4 本章知识体系

下面这张图,是我自己梳理的固件获取路径。你跟着走,基本不会漏。

固件获取与提取:三条路径 路径1:官网下载 厂商支持页面 历史版本挖掘 哈希校验 路径2:Flash芯片读取 SPI编程器 夹子/座子连接 读取+校验 解除读保护 路径3:OTA升级包 代理抓包 路由器抓包 分片重组 解密+解包 固件二进制文件 (.bin / .img) 三条路径最终汇聚到同一个目标:拿到完整的固件镜像

三条路径,各有优劣。官网下载最省事,但可能拿不到完整版本。Flash 读取最可靠,但需要硬件动手能力。OTA 提取最灵活,但抓包和解密环节容易卡住。

我个人建议:如果条件允许,三条路径都走一遍。交叉验证,确保你拿到的固件是完整的、未被篡改的。我在一个项目中,官网下载的固件和 Flash 读出来的固件,哈希值居然不一样——后来发现是厂商在 OTA 过程中打了补丁。嗯,这种「版本漂移」现象,只有对比才能发现。

核心原则: 固件获取不是一次性的。随着分析深入,你可能需要重新提取。所以,保留好每一次的原始 dump,标注清楚设备型号、固件版本、提取日期。这是专业习惯。

专注资料整理