固件获取与提取:从硬件到二进制
做固件安全分析,第一步就是拿到固件。这听起来简单,但实际坑不少。我刚开始接触这行时,以为固件就是去官网下载个zip包完事。后来发现,很多设备压根不给你公开固件,或者给了也是加密的。今天我就把固件获取的几种途径、解包工具和结构分析方法,一次性讲清楚。
固件获取的三大途径
固件获取,说白了就是「把二进制代码从设备里弄出来」。根据设备类型和你的权限,主要有三条路。
1. 官网下载
这是最省事的方式。大部分消费级路由器、智能家居设备,厂商都会在官网提供固件更新包。我个人习惯先去官网的「支持」或「下载」页面找找看。格式通常是 .bin、.trx、.img 或 .zip。
2. OTA抓包
如果官网不提供固件,或者你拿到的设备是已经联网的,OTA(Over-The-Air)更新就是你的突破口。我曾经在分析某款智能摄像头时,官网死活找不到固件,最后通过抓取设备升级时的网络流量,拿到了完整的固件包。
常用的抓包工具有:
- Burp Suite:配置好代理,拦截HTTPS流量
- mitmproxy:命令行神器,适合脚本化操作
- Wireshark:分析底层网络协议,比如TFTP、FTP
嗯,这里要注意:很多设备会校验固件签名,OTA抓到的包可能是加密的。但至少你拿到了原始数据,后续可以分析加密算法。
3. 编程器读取
这是最硬核的方式。当软件层面拿不到固件时,就得动硬件了。编程器(如CH341A、FT2232H)可以直接读取Flash芯片里的数据。
操作步骤大致如下:
- 拆开设备,找到Flash芯片(常见型号:Winbond、MXIC、GD)
- 用夹子或焊接方式连接编程器
- 读取整个Flash内容,保存为二进制文件
固件解包工具:把二进制拆开看
拿到固件文件后,它通常是一个完整的二进制镜像,里面包含了文件系统、内核、引导程序等。我们需要把它拆开,才能分析里面的内容。
1. binwalk:最常用的固件分析工具
binwalk 是我用得最多的工具。它能自动识别固件中的文件系统、压缩数据、内核镜像等。
# 扫描固件中的文件签名
binwalk firmware.bin
# 提取所有识别到的文件
binwalk -e firmware.bin
# 递归提取(处理嵌套压缩)
binwalk -Me firmware.bin
binwalk 的签名库很丰富,支持 SquashFS、JFFS2、CramFS、LZMA、gzip 等常见格式。但要注意,如果固件被加密或混淆,binwalk 可能什么都识别不出来。
2. dd:手动切割二进制文件
有时候 binwalk 识别不准确,或者你想手动提取特定偏移位置的数据,dd 命令就派上用场了。
# 从偏移0x100000处读取1MB数据
dd if=firmware.bin of=output.bin bs=1 skip=$((0x100000)) count=$((0x100000))
我个人习惯先用 hexdump 或 xxd 查看固件头部,找到文件系统的偏移和大小,再用 dd 精确切割。
3. unblob:新一代固件解包利器
unblob 是近几年出现的工具,专门处理复杂或嵌套的固件格式。它比 binwalk 更智能,能自动处理多级压缩和自定义格式。
# 解包固件
unblob firmware.bin
# 指定输出目录
unblob firmware.bin -o output_dir
我在分析某款工业路由器固件时,binwalk 只识别出了第一层 LZMA 压缩,但 unblob 自动解开了三层嵌套,直接拿到了 SquashFS 文件系统。嗯,这个工具值得一试。
固件结构分析:理解二进制布局
解包之后,我们需要理解固件的整体结构。一个典型的固件镜像通常包含以下部分:
| 区域 | 说明 | 常见格式 |
|---|---|---|
| Bootloader | 引导程序,初始化硬件 | U-Boot、RedBoot |
| Kernel | 操作系统内核 | zImage、uImage |
| RootFS | 根文件系统,包含应用程序 | SquashFS、JFFS2、UBIFS |
| Config | 设备配置参数 | JSON、二进制blob |
| Signature | 固件签名,用于完整性校验 | RSA、ECDSA |
分析固件结构时,我通常会先看头部信息。很多固件在开头会有一个魔数(Magic Number),比如 HDR0、TRX、BIN 等。通过魔数可以快速判断固件类型。
知识体系框架
下面这张图展示了本章的核心逻辑:从固件获取到解包,再到结构分析,是一条完整的技术链路。
避坑指南
最后,分享几个我踩过的坑:
- 固件加密:我曾经遇到一个固件,binwalk 什么都扫不出来。后来发现厂商用了 AES 加密,密钥藏在 U-Boot 源码里。所以,别放弃,多找找源码泄露。
- 文件系统损坏:用编程器读取时,如果 Flash 芯片有坏块,读出来的数据可能不完整。建议多读几次,对比校验。
- 大小端问题:有些固件头部信息是大端序,有些是小端序。用
hexdump查看时,注意字节序,否则偏移量算错。
固件获取与提取,是整个漏洞挖掘的基础。这一步走扎实了,后面的分析才能顺利。嗯,今天就先聊到这里。
公众号:蓝海资料掘金营,微信deep3321