固件获取与提取:固件获取方法、binwalk工具使用、固件解包
做IoT安全分析,第一步就是拿到固件。没有固件,后面全是空谈。
我刚开始接触这行时,以为固件只能从官网下载。后来才发现,获取固件的方式其实挺多的。官网、串口、SPI Flash,各有各的适用场景。今天我就把这几种方法掰开揉碎了讲一讲。
固件获取的三种主流方式
1. 官网下载
这是最省事的方法。大部分厂商都会在官网提供固件更新包。你只需要找到对应的产品型号,下载就行。
不过,这里有个坑——有些厂商会把固件打包成加密格式,或者用专有的升级工具。我遇到过一台智能摄像头,官网下载的固件是 .bin 文件,但用 binwalk 一分析,发现头部被厂商魔改过,直接解包会报错。后来我对比了串口抓取的原始固件,才发现官网的固件被加了一段自定义头。
2. 串口获取
串口是嵌入式设备的标配。很多设备在启动时会通过串口输出启动日志,甚至提供 uboot 命令行。如果你能进入 uboot,就可以用 tftp 或 loadb 命令把固件 dump 出来。
具体怎么做?
- 找到设备主板上的串口焊点,一般是 4 个引脚(VCC、GND、TX、RX)。
- 用 USB 转 TTL 模块连接,波特率通常设为 115200 或 57600。
- 上电后按任意键进入 uboot 命令行。
- 输入
printenv查看环境变量,找到固件在 Flash 中的地址。 - 用
sf read 0x82000000 0x0 0x100000之类的命令读取 Flash 内容。
3. SPI Flash 读取
如果串口被禁用了,或者设备没有提供 uboot 接口,那就只能硬来了——直接读取 SPI Flash 芯片。
SPI Flash 是 IoT 设备中最常见的存储芯片,型号通常是 Winbond、Macronix 或 Gigadevice 的。你需要用编程器(比如 CH341A)夹住芯片的引脚,然后读取整个 Flash 内容。
步骤很简单:
- 拆开设备,找到 SPI Flash 芯片(一般是 8 个引脚)。
- 用烧录夹夹住芯片,或者直接焊下来放到编程器上。
- 用编程器软件读取,保存为 .bin 文件。
核心要点: SPI Flash 读取的是原始二进制数据,包含 bootloader、内核、文件系统、配置信息等。这是最完整的固件获取方式,没有之一。
binwalk 工具使用
拿到固件后,第一件事就是分析它。binwalk 是我最常用的工具,没有之一。它就像一把瑞士军刀,能帮你快速识别固件里藏了什么东西。
基本用法:
binwalk firmware.bin
输出结果会显示固件中各个文件的偏移地址、文件类型和大小。比如:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 U-Boot version string, "U-Boot 1.1.4"
131072 0x20000 Linux kernel image, gzip compressed
262144 0x40000 Squashfs filesystem, little endian, version 4.0
看到没?固件里通常包含 U-Boot、Linux 内核和 Squashfs 文件系统。binwalk 能自动识别这些结构。
-e 参数可以直接解包:binwalk -e firmware.bin。它会自动提取所有识别的文件。如果遇到加密固件,可以试试 binwalk -Me 递归扫描。
我个人习惯先用 binwalk -Me 跑一遍,看看能不能自动解包。如果不行,再手动分析。有一次我遇到一个固件,binwalk 只识别出了 U-Boot,后面的内核和文件系统都识别不出来。后来我用 binwalk -R 手动搜索文件系统签名,才发现厂商把 Squashfs 的魔数改成了 0xDEADBEEF。说白了,就是厂商故意混淆,让你解不开。
固件解包实战
解包是固件分析的核心。常见的文件系统有 Squashfs、Cramfs、JFFS2、YAFFS2 等。binwalk 能解大部分,但有些需要手动处理。
举个例子,Squashfs 文件系统:
# 用 binwalk 自动解包
binwalk -e firmware.bin
# 手动解包(如果 binwalk 失败)
dd if=firmware.bin bs=1 skip=262144 of=squashfs.img
unsquashfs squashfs.img
这里 skip=262144 是文件系统的偏移地址,从 binwalk 的输出里可以找到。
lzma、lzop。我遇到过一台路由器,固件用的是 LZMA 压缩的 Cramfs,binwalk 解不出来,最后我手动用 lzma -d 解压后才搞定。
解包完成后,你会得到一个文件夹,里面是完整的文件系统。这时候就可以开始分析了——找配置文件、找硬编码密码、找后门程序。嗯,这才是真正有意思的部分。
总结一下: 固件获取是基础,binwalk 是利器,解包是门槛。这三步走通了,后面的漏洞挖掘才有得玩。
好了,关于固件获取与提取的内容就讲到这里。记住,拿到固件只是第一步,后面还有更多挑战等着你。