3、固件获取与预处理:固件提取方法(芯片读取、OTA抓包、文件系统解包)、固件格式识别与解压
固件是嵌入式设备中运行的全部软件集合,包括引导加载程序(Bootloader)、操作系统内核、设备驱动程序、文件系统以及应用程序。在开展模糊测试之前,获取目标固件并完成预处理是决定后续测试深度与效率的关键环节。若固件获取不完整或格式识别错误,后续的静态分析、模拟执行和动态模糊测试都将失去可靠基础。本章围绕固件获取的三大途径——芯片读取、OTA抓包、文件系统解包,以及固件格式识别与解压的核心方法展开,帮助学员建立从物理介质到可分析文件系统的完整处理链路。
3.1 固件获取的核心原理与途径选择
固件获取的本质是从物理设备、网络链路或已有软件包中提取出完整的固件镜像。不同获取途径对应不同的设备访问权限和适用场景。芯片读取适用于已拥有物理设备且无法通过软件方式获取固件的场景;OTA抓包适用于设备支持网络升级且可控制网络环境的场景;文件系统解包则适用于已获得固件压缩包或升级文件的场景。实际工作中,三种途径往往需要组合使用,例如先通过OTA抓包获取加密固件,再结合芯片读取获取解密密钥。
| 获取途径 | 适用场景 | 所需工具 | 风险等级 | 成功率 |
|---|---|---|---|---|
| 芯片读取 | 物理设备在手,无其他获取渠道 | 编程器、JTAG调试器、热风枪 | 高(可能损坏设备) | 中高 |
| OTA抓包 | 设备支持网络升级,可控制网络 | Burp Suite、mitmproxy、Wireshark | 低 | 高 |
| 文件系统解包 | 已获得固件升级包或从官网下载 | binwalk、7z、unsquashfs | 无 | 极高 |
3.2 芯片读取:从物理介质提取固件
芯片读取是获取固件的最后手段,也是最直接的方式。常见的目标芯片包括SPI NOR Flash、NAND Flash、eMMC以及MCU内置Flash。对于SPI NOR Flash,可以使用编程器配合测试夹或直接拆焊后读取;对于BGA封装的NAND或eMMC,则需要热风枪拆焊并使用专用座子读取。JTAG/SWD接口提供了另一种思路——通过调试接口直接访问芯片内部存储,但许多量产设备会禁用调试接口。
芯片读取的标准操作流程如下:
- 芯片识别:通过丝印查询芯片型号,确认存储类型、容量和封装。
- 接口连接:优先使用测试夹(SOP8/SOP16),避免拆焊;若空间受限则需拆焊。
- 读取参数配置:在编程器软件中设置正确的芯片型号、读取速度和电压。
- 执行读取:读取完整镜像并保存为.bin文件,建议读取两次并比对哈希值。
- 验证完整性:使用binwalk检查镜像结构,确认是否包含文件系统。
3.3 OTA抓包:从网络链路截获固件
OTA(Over-The-Air)升级是物联网设备常见的固件更新方式。通过代理工具拦截设备与升级服务器之间的通信,可以获取固件下载地址或直接截获固件内容。此方法的关键在于让设备的HTTPS证书校验失效,通常需要将代理的CA证书安装到设备信任库中,或者通过DNS劫持将升级域名指向本地服务器。
OTA抓包的具体操作步骤:
- 搭建无线热点或接入现有网络,配置代理工具监听80/443端口。
- 将设备网络指向代理,触发设备执行固件检查或升级操作。
- 在代理日志中筛选包含"firmware"、"update"、"upgrade"等关键词的请求。
- 下载固件文件,验证其格式和完整性。
- 若固件经过加密,需进一步分析解密逻辑(常见于Bootloader中)。
3.4 固件格式识别与解压
获取到固件原始文件后,首要任务是识别其内部结构。固件通常由Bootloader、内核、文件系统、设备树等部分组成,各部分可能经过压缩或加密。binwalk是最常用的固件分析工具,它通过扫描文件中的魔数(Magic Number)来识别嵌入式文件系统、压缩算法和已知签名。
# 使用binwalk扫描固件结构
binwalk firmware.bin
# 递归提取所有可识别文件
binwalk -Me firmware.bin
# 查看详细签名信息
binwalk -A firmware.bin
# 使用file命令快速识别
file firmware.bin
常见的固件文件系统类型及其解包工具如下:
| 文件系统类型 | 魔数特征 | 解包工具 | 备注 |
|---|---|---|---|
| SquashFS | hsqs (0x68737173) | unsquashfs / sasquatch | 只读压缩文件系统,广泛用于路由器 |
| Cramfs | 0x28cd3d45 | cramfsck / cramfs-tools | 老式嵌入式设备常见 |
| JFFS2 | 0x1985 (节点魔数) | jefferson / jffs2dump | NOR Flash常用,需指定擦除块大小 |
| UBIFS | UBI# (0x55424923) | ubireader_extract_files | NAND Flash常用,需处理UBI卷 |
| cpio | 070701 / 070702 | cpio -idmv | 常用于initramfs |
3.5 案例拆解:某品牌路由器固件完整提取与分析
本案例以某品牌家用路由器为对象,完整演示从固件获取到文件系统解包的实战过程。该路由器使用联发科MT7621芯片,固件版本为V1.0.4,通过官网直接下载获得固件包,文件名为"router_v1.0.4.bin",大小约12.8MB。
初始目标:提取文件系统,定位Web管理后台的认证逻辑代码,为后续模糊测试准备测试目标。
操作过程:
- 初步识别:执行
file router_v1.0.4.bin,输出为"data",说明文件头被自定义封装。 - binwalk扫描:执行
binwalk router_v1.0.4.bin,在偏移量0x20000处发现SquashFS文件系统签名"hsqs",同时在0x0处发现U-Boot引导加载程序特征。 - 分段提取:使用
dd if=router_v1.0.4.bin of=kernel.bin bs=1 skip=0 count=131072提取Bootloader区域;使用dd if=router_v1.0.4.bin of=rootfs.squashfs bs=1 skip=131072提取文件系统。 - 解包SquashFS:执行
unsquashfs -d rootfs rootfs.squashfs,成功解包出完整的根文件系统,包含/etc、/usr/bin、/www等目录。 - 内核提取:在偏移量0x20000之前发现LZMA压缩的内核镜像,使用
binwalk -e kernel.bin自动解压,得到vmlinux内核文件。 - 验证结果:在解包后的/www目录中找到Web管理页面源码,在/usr/sbin目录下发现httpd守护进程二进制文件。
结果与复盘:整个提取过程耗时约15分钟,成功获得完整的文件系统。关键经验在于:binwalk的自动提取模式(-Me)虽然方便,但有时会误报或漏报,建议结合手动dd分段提取。此外,该固件未加密,若遇到加密固件,需先定位解密函数(通常在Bootloader中),或通过芯片读取获取解密后的镜像。
md命令直接读取内存中的解密后数据。部分设备在启动时会先将固件解密到内存中,此时可通过JTAG或串口抓取内存镜像。
3.6 常见误区与总结复盘
在固件获取与预处理过程中,初学者常犯以下错误:
- 忽视固件头部的自定义封装:许多厂商会在标准文件系统前添加自定义头部(包含版本号、校验和、加密标志等),直接使用binwalk可能无法识别。应先使用
hexdump -C查看文件头部,分析自定义结构。 - 混淆文件系统类型:SquashFS存在多个版本(v3/v4),不同版本需要不同工具解包。sasquatch工具支持更多非标准变体,建议优先尝试。
- 忽略NAND Flash的坏块管理:从NAND芯片读取的镜像可能包含坏块标记和OOB数据,直接解包会失败。需使用nanddump工具并处理OOB区域。
- 未验证固件完整性:截获的OTA固件可能经过分块传输或Base64编码,需先重组并解码,再计算MD5/SHA256与官方发布版本比对。
总结复盘:固件获取与预处理是嵌入式安全测试的基石。芯片读取、OTA抓包、文件系统解包三条路径互为补充,覆盖了从物理层到网络层的全部获取场景。格式识别与解压环节需要结合binwalk、file、hexdump等工具进行交叉验证,避免单一工具的误判。建议在实际项目中建立固件处理的标准操作流程,包括哈希校验、结构扫描、分段提取、文件系统解包、内容索引五个步骤,确保固件分析的完整性和可复现性。对于加密固件,应优先尝试Bootloader漏洞、内存转储、密钥提取等进阶手段,为后续模糊测试铺平道路。