第三章:固件获取与初步分析

说实话,做固件逆向这么多年,我见过太多人卡在第一步——固件都拿不到,后面全是白搭。这一章咱们就聊聊怎么把固件搞到手,再给它做个初步体检。

3.1 从Flash芯片读取固件

这是最硬核的方式。你手上有块板子,芯片焊在上面,怎么把固件读出来?

我个人习惯用SPI Flash编程器。市面上常见的如CH341A、FT2232H,便宜又好用。操作步骤其实不复杂:

  1. 定位Flash芯片——看丝印,找25系列、MXIC、Winbond这些常见型号
  2. 连接引脚——CS、MISO、MOSI、CLK、VCC、GND,这六根线必须接对
  3. 读取数据——用flashrom或专用软件,指定芯片型号和大小

实战经验:我在一次项目中遇到过一块Cisco 2960交换机,Flash芯片被涂了黑胶。当时我以为是保护措施,后来才发现是散热胶。用酒精擦掉就好,别硬撬。

# 使用flashrom读取固件
flashrom -p ch341a_spi -r cisco_firmware.bin

# 验证读取完整性
flashrom -p ch341a_spi -v cisco_firmware.bin

注意:有些板子有写保护引脚(WP#)或硬件保护寄存器。我曾经因为没注意这个,读出来的数据全是0xFF,白忙活半天。

3.2 通过TFTP/HTTP获取固件

如果设备还能正常启动,那就不用拆机了。直接从网络抓固件,省时省力。

思科设备通常支持TFTP上传下载。你只需要搭建一个TFTP服务器,然后在设备上执行命令:

# 在思科设备上
copy flash:image.bin tftp://192.168.1.100/image.bin

# 或者从TFTP下载到设备
copy tftp://192.168.1.100/new_image.bin flash:

HTTP方式也类似。很多设备有Web管理界面,直接点下载就行。但要注意,有些厂商会做手脚——下载的固件可能被加密或截断。

小技巧:我建议先用Wireshark抓包看看。有时候设备会先请求一个校验文件,再下载真正的固件。你光抓固件包,可能漏掉关键信息。

3.3 固件加密与压缩识别

拿到固件文件后,别急着解包。先看看它是什么货色。

我一般用file命令和hexdump先瞄一眼:

# 查看文件类型
file cisco_firmware.bin

# 查看文件头
hexdump -C cisco_firmware.bin | head -20

常见的加密和压缩特征:

特征 可能含义 我的经验
文件头为1F 8B gzip压缩 最常见,直接解压就行
文件头为42 5A 68 bzip2压缩 老设备喜欢用这个
文件头为FD 37 7A 58 5A xz压缩 新设备开始用了
熵值很高(接近8) 可能加密了 这时候就要找密钥了
全是重复字节 可能只是填充 跳过这部分,找真正的固件

为什么会这样?说白了,厂商为了节省存储空间,都会把固件压缩。但有些厂商为了防逆向,还会加密一层。

避坑指南:我曾经遇到一个固件,用Binwalk解出来全是乱码。后来才发现,厂商在固件开头加了256字节的随机填充。去掉之后,才看到真正的文件头。

3.4 使用Binwalk解包固件

Binwalk是我最常用的固件分析工具,没有之一。它能自动识别文件系统中的各种签名。

基本用法:

# 扫描固件中的文件
binwalk cisco_firmware.bin

# 提取所有文件
binwalk -e cisco_firmware.bin

# 只提取特定类型
binwalk -D 'squashfs:rootfs:squashfs' cisco_firmware.bin

Binwalk的输出会告诉你:

  • 文件偏移位置
  • 文件类型(SquashFS、JFFS2、uImage等)
  • 文件大小
  • 描述信息

个人经验:Binwalk有时候会误判。我建议你结合手动分析——用hexdump看看文件头,再用strings命令搜一下关键字符串。比如搜"root"、"admin"、"password"这些,能帮你快速定位文件系统。

解包之后,你通常会得到:

  • 一个rootfs目录——文件系统
  • 一些配置文件
  • 内核镜像
  • 可能还有Bootloader

嗯,这里要注意:有些固件是分区的。比如Cisco的IOS,它把Bootloader、内核、文件系统都放在一个文件里,但每个分区有自己的头信息。Binwalk能识别这些分区,但提取后你要手动检查每个分区的内容。

警告:解包后的文件系统,千万别直接挂载到你的开发机上。我曾经干过这事,结果固件里的恶意脚本直接把我系统搞崩了。用chroot或者容器环境来操作,安全第一。

最后,我建议你把解包后的文件做个哈希校验。这样后续修改后,能快速对比出哪些文件变了。

# 生成文件列表和哈希
find rootfs -type f -exec md5sum {} \; > file_hashes.txt

好了,固件拿到手,也解包了。接下来就是深入分析驱动和硬件交互的部分。不过那是后面章节的事,咱们先把基础打牢。


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