4. 固件字符串提取

任务目标

对给定的路由器固件二进制文件执行字符串提取,通过分析可打印字符串快速判断固件类型、架构特征、文件系统格式及潜在敏感信息(如版本号、文件路径、调试开关),为后续深度逆向建立初步认知。

环境准备

本案例使用 binutils 包中的 strings 命令,所有主流 Linux 发行版默认包含。验证文件类型需 file 命令。无需额外安装。

固件样本

以下最小固件样本由真实路由器固件头部拼接生成,保留典型特征,可直接保存为 fw.bin 用于本案例全部命令:

# 生成测试固件(包含头部、内核版本字符串、文件系统标记)
printf 'U-Boot 1.1.4 (Mar 28 2019 - 14:32:05)\0' > fw.bin
printf 'Linux version 3.10.14 (build@server) (gcc version 4.8.3) #1 SMP\0' >> fw.bin
printf 'squashfs!'\0 >> fw.bin
printf '/etc/passwd\0/var/tmp\0/usr/sbin/httpd\0' >> fw.bin
printf 'admin:admin\0root:toor\0' >> fw.bin
printf 'CONFIG_DEBUG_ENABLE=1\0' >> fw.bin
printf 'MIPS\0' >> fw.bin
printf 'Atheros\0' >> fw.bin
printf 'WNR2000v4\0' >> fw.bin
printf '\x00\x00\x00\x00\x00\x00\x00\x00' >> fw.bin  # 填充

完整实现与执行

核心操作仅需一条命令。以下为完整提取流程:

# 1. 确认固件基本信息
file fw.bin

# 2. 提取默认长度≥4的可打印字符串(标准用法)
strings -n 4 fw.bin

# 3. 提取所有ASCII字符串(含短字符串,如"MIPS")
strings -n 2 fw.bin

# 4. 同时输出字符串在文件中的偏移地址(便于定位)
strings -t x -n 4 fw.bin

若分析真实固件,建议先用 binwalk 查看固件结构,再针对解包后的文件系统镜像执行 strings,可显著减少噪声。

验证方法与判定标准

执行上述命令后,预期输出应包含以下关键字符串(与样本内容严格对应):

# 步骤2输出(截取关键行)
U-Boot 1.1.4 (Mar 28 2019 - 14:32:05)
Linux version 3.10.14 (build@server) (gcc version 4.8.3) #1 SMP
squashfs!
/etc/passwd
/var/tmp
/usr/sbin/httpd
admin:admin
root:toor
CONFIG_DEBUG_ENABLE=1
WNR2000v4

判定通过条件:

  • 步骤2输出包含 squashfs!,确认文件系统为 SquashFS;
  • 输出包含 Linux version 3.10.14 与 U-Boot 1.1.4,确认引导程序与内核版本;
  • 输出包含 /etc/passwd、admin:admin,识别到潜在敏感路径与弱口令;
  • 步骤4输出每行前带十六进制偏移(如 0、2c),可用于后续定位。

若步骤2未显示 MIPS(长度不足4被过滤),步骤3中应出现,说明短字符串需调低 -n 阈值。

常见问题

  • 输出大量乱码:固件含压缩段或二进制数据,使用 -n 8 提高长度阈值,或结合 binwalk 先解包再提取。
  • 字符串被加密或压缩:strings 仅提取明文,若固件启用加密/压缩,需先解密或解压,本案例不涉及。
  • UTF-16 字符串:部分固件使用宽字符,加 -e l 参数提取16位小端格式字符串。