第二章:固件获取与提取

各位好,我是老李。做固件安全这些年,我最大的感触就是——拿不到固件,一切都是空谈。今天咱们就聊聊固件获取与提取的三种主流途径:从Flash芯片硬读、从OTA包里拆解、从更新工具里抓取。这三种方法我都在项目里用过,各有各的门道。

2.1 从Flash芯片读取固件

这是最直接、也最“硬核”的方式。说白了,就是拿编程器直接怼芯片。我刚开始干这行时,觉得这活儿简单,结果第一次就翻车了——焊盘被我搞坏了三个。

2.1.1 识别Flash芯片型号

拿到一块板子,先找Flash芯片。常见的封装有SOIC-8、SOIC-16、WSON-8等。芯片表面通常会印着型号,比如W25Q64、MX25L128等。我个人习惯用手机微距镜头拍一张,然后去查数据手册。

小技巧: 如果芯片表面被磨掉了(有些厂商会这么做),可以看电路板上的丝印,或者用万用表测引脚电压,反推芯片类型。

2.1.2 连接编程器

常用的编程器有CH341A、FT2232H、树莓派GPIO等。连接方式很简单:

  • VCC → 3.3V(注意电压匹配)
  • GND → 地
  • CLK → 时钟
  • MOSI/MISO → 数据线
  • CS → 片选

嗯,这里要注意:有些板子上的Flash是在线的,也就是CPU也在跑。这时候直接上编程器可能会干扰总线。我建议先断开CPU的供电,或者用夹子夹住芯片,但别上电。

2.1.3 读取与校验

用软件(比如FlashROM、SPI Flash Programmer)读取整个芯片内容。命令示例:

# 使用flashrom读取W25Q64
flashrom -p ch341a_spi -r firmware.bin

# 校验读取是否完整
flashrom -p ch341a_spi -v firmware.bin

读取完成后,一定要做两次读取并比对MD5。我曾经遇到过编程器接触不良,读出来的数据全是0xFF,差点把假固件当宝贝分析了一整天。

避坑指南: 我曾经在读取一个IoT网关的Flash时,没注意芯片是1.8V供电,直接用3.3V的编程器怼上去,结果芯片冒烟了。所以,先查数据手册,确认电压

2.2 从OTA包提取固件

OTA(Over-The-Air)更新包是另一个固件来源。很多设备会通过网络下载更新包,然后解压、校验、刷写。我们只要抓到那个包,就能拿到固件。

2.2.1 抓取OTA包

方法有很多:

  • 抓包工具:用Wireshark或Burp Suite监听设备与服务器的通信
  • 逆向App:从手机App里提取下载链接
  • 模拟服务器:搭建一个假的更新服务器,让设备来连

我个人比较喜欢用mitmproxy做中间人攻击。把设备的HTTPS流量截下来,就能看到下载地址。当然,有些设备会做证书锁定,那就得先破解证书校验。

2.2.2 解包OTA文件

OTA包通常不是裸固件,而是经过打包的。常见格式有:

格式 特征 解包工具
ZIP PK头(0x504B) unzip、7z
tar.gz 1F 8B 08开头 tar -xzf
squashfs hsqs或sqsh标识 unsquashfs
自定义格式 厂商魔改的头部 需要逆向分析

举个例子,我拆过一个智能摄像头的OTA包,发现它其实是squashfs文件系统。用unsquashfs解压后,直接看到了文件系统树,连root密码都硬编码在里面。

核心思路: 先看文件头,判断格式。如果是自定义格式,就找固件里的解包函数,或者直接看更新脚本。

2.2.3 处理加密与签名

很多OTA包是加密的。常见加密方式有:

  • AES-128/256:密钥可能硬编码在App或Bootloader里
  • RSA签名:先验签,再解密
  • XOR简单加密:有些小厂直接用固定Key做XOR

我遇到过最离谱的一次,厂商把AES密钥写在了OTA包的文件名里。你想想看,这跟把钥匙挂在门上有什么区别?

2.3 从固件更新工具抓取

有些设备没有OTA功能,而是通过PC端的更新工具(比如刷机软件)来升级。这时候,我们可以从工具本身下手。

2.3.1 抓取USB/串口通信

更新工具通常通过USB或串口与设备通信。我们可以用:

  • USBlyzer:抓取USB数据包
  • 串口监听器:比如AccessPort、ComMonitor
  • 逻辑分析仪:直接抓SPI/UART信号

我记得有一次,一个路由器厂商的更新工具只支持Windows。我开了个虚拟机,在宿主机上用Wireshark抓USB流量,然后分析出固件是通过批量传输发过去的。把那段数据流dump出来,就是完整的固件。

2.3.2 逆向更新工具

如果抓包太麻烦,可以直接逆向更新工具的二进制文件。用IDA Pro或Ghidra打开,找到固件下载或解密的函数。常见套路:

  • 工具里会有一个固件缓冲区,在内存中解密后写入设备
  • 用调试器(x64dbg、OllyDbg)下断点,dump内存
  • 或者直接patch掉加密逻辑,让工具输出明文固件

嗯,这里要提醒一句:逆向Windows工具时,记得先查一下有没有反调试。我遇到过工具会检测调试器,一旦发现就蓝屏。后来我用ScyllaHide插件才绕过去。

2.3.3 从日志文件提取

有些更新工具会把固件临时解压到%TEMP%目录,或者写日志时把固件内容打印出来。我建议先搜一下工具目录下的.bin.img.fw文件。有时候,固件就静静地躺在那里等你拿。

个人经验: 有一次我找固件找了三天,最后发现更新工具在C:\ProgramData\Vendor\Temp里留了个副本。厂商连删都没删。所以,先看临时目录,往往有惊喜。

知识体系总览

下面这张图概括了本章的核心逻辑:

固件获取与提取三大途径 从Flash芯片读取 从OTA包提取 从更新工具抓取 识别芯片型号 连接编程器 读取与校验 抓取OTA包 解包OTA文件 处理加密签名 抓USB/串口 逆向更新工具 从日志提取 最终目标:获取完整的、可分析的固件二进制

好了,以上就是固件获取与提取的三种主流方法。每种方法都有适用的场景,也有各自的坑。我个人建议,如果你手头有硬件,优先从Flash芯片读,因为最直接、最完整。如果设备已经量产,OTA包往往更容易拿到。至于更新工具,适合那些没有网络功能的嵌入式设备。

记住一点:拿到固件只是第一步,后面还有加密分析、漏洞挖掘等着你。但这一步走扎实了,后面的路就好走了。


公众号:蓝海资料掘金营,微信deep3321