固件获取与提取:固件获取方法、binwalk工具使用、固件解包

做IoT安全分析,第一步就是拿到固件。没有固件,后面全是空谈。

我刚开始接触这行时,以为固件只能从官网下载。后来才发现,获取固件的方式其实挺多的。官网、串口、SPI Flash,各有各的适用场景。今天我就把这几种方法掰开揉碎了讲一讲。

固件获取的三种主流方式

1. 官网下载

这是最省事的方法。大部分厂商都会在官网提供固件更新包。你只需要找到对应的产品型号,下载就行。

不过,这里有个坑——有些厂商会把固件打包成加密格式,或者用专有的升级工具。我遇到过一台智能摄像头,官网下载的固件是 .bin 文件,但用 binwalk 一分析,发现头部被厂商魔改过,直接解包会报错。后来我对比了串口抓取的原始固件,才发现官网的固件被加了一段自定义头。

小技巧: 官网下载的固件如果解不开,可以试试用 hexdump 查看文件头部。常见的固件头有 "HDR0"、"TRX"、"U-Boot" 等。如果头部全是乱码,大概率是被加密或加壳了。

2. 串口获取

串口是嵌入式设备的标配。很多设备在启动时会通过串口输出启动日志,甚至提供 uboot 命令行。如果你能进入 uboot,就可以用 tftploadb 命令把固件 dump 出来。

具体怎么做?

  1. 找到设备主板上的串口焊点,一般是 4 个引脚(VCC、GND、TX、RX)。
  2. 用 USB 转 TTL 模块连接,波特率通常设为 115200 或 57600。
  3. 上电后按任意键进入 uboot 命令行。
  4. 输入 printenv 查看环境变量,找到固件在 Flash 中的地址。
  5. sf read 0x82000000 0x0 0x100000 之类的命令读取 Flash 内容。
注意: 串口获取固件需要硬件接触,操作时一定要小心短路。我曾经因为焊点没处理好,把一块开发板的 TX 和 RX 焊在了一起,结果烧了串口芯片。嗯,从那以后我每次焊接都会用万用表先测一下通断。

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 或 LZO 压缩,需要安装对应的解压工具。比如 lzmalzop。我遇到过一台路由器,固件用的是 LZMA 压缩的 Cramfs,binwalk 解不出来,最后我手动用 lzma -d 解压后才搞定。

解包完成后,你会得到一个文件夹,里面是完整的文件系统。这时候就可以开始分析了——找配置文件、找硬编码密码、找后门程序。嗯,这才是真正有意思的部分。

总结一下: 固件获取是基础,binwalk 是利器,解包是门槛。这三步走通了,后面的漏洞挖掘才有得玩。

固件获取与提取知识体系 固件获取 binwalk 分析 固件解包 官网下载 串口获取 SPI Flash 读取 自动识别 手动分析 递归解包 Squashfs Cramfs JFFS2/YAFFS2 三种获取方式 → binwalk 分析 → 解包提取文件系统 最终目标:获取完整的文件系统,开始漏洞挖掘

好了,关于固件获取与提取的内容就讲到这里。记住,拿到固件只是第一步,后面还有更多挑战等着你。

专注资料整理