3. 固件字符串提取
任务说明
本案例目标:对一个给定的固件二进制文件使用 strings 工具提取可打印字符串,并基于提取结果初步判断固件中可能包含的文件系统、内核版本、应用程序或配置信息。本案例使用一个合成的演示固件 demo_fw.bin 作为输入,该固件由一段引导头、一个压缩的Linux内核(模拟)和一个包含文本配置的JFFS2文件系统镜像(模拟)拼接而成。
环境准备
需要一台Linux主机(或WSL),并安装 binutils(提供 strings 命令)。大多数发行版默认已安装,若缺失可通过 sudo apt install binutils(Debian/Ubuntu)或 sudo yum install binutils(RHEL/CentOS)安装。
生成演示固件
为了独立复现本案例,先创建一个包含典型嵌入式固件特征的演示文件。将以下命令保存为 make_demo.sh 并执行:
#!/bin/bash
# 生成演示固件 demo_fw.bin
# 1) 创建引导头(包含版本信息)
echo "U-Boot 2020.04-demo" > header.txt
echo "HW: demo-board-v2" >> header.txt
# 2) 模拟压缩内核(包含内核版本字符串)
echo "Linux version 5.10.120-demo (build@server) (gcc version 9.4.0)" > kernel.txt
gzip -c kernel.txt > kernel.gz
# 3) 模拟JFFS2文件系统(包含配置文件内容)
mkdir -p rootfs/etc
echo "hostname=router-demo" > rootfs/etc/config.txt
echo "ssid=DemoAP-5G" >> rootfs/etc/config.txt
echo "password=admin123" >> rootfs/etc/config.txt
# 简单拼接(实际固件有更复杂的结构,此处仅用于演示)
cat header.txt kernel.gz rootfs/etc/config.txt > demo_fw.bin
echo "生成完成: demo_fw.bin ($(stat -c%s demo_fw.bin) 字节)"
执行 bash make_demo.sh 后得到 demo_fw.bin。
提取字符串
使用 strings 工具提取固件中长度至少为6的可打印字符串:
strings -n 6 demo_fw.bin
若希望同时显示字符串在文件中的偏移量,便于定位所属区域,可加 -t x 参数(十六进制偏移):
strings -n 6 -t x demo_fw.bin
预期输出与分析
基于上述演示固件的构造方式,strings -n 6 demo_fw.bin 的预期输出应包含以下关键内容(顺序与文件拼接顺序一致):
U-Boot 2020.04-demo
HW: demo-board-v2
Linux version 5.10.120-demo (build@server) (gcc version 9.4.0)
hostname=router-demo
ssid=DemoAP-5G
password=admin123
注意:由于内核部分经过gzip压缩,strings 默认不会解压,因此压缩内容中的字符串不会直接显示。这是真实固件分析中的常见现象——需要先识别压缩算法并解压后再提取。
初步分析要点
- 引导加载程序:出现
U-Boot字样表明固件使用U-Boot作为bootloader,版本为2020.04。 - 硬件平台:
HW: demo-board-v2提示目标硬件为demo-board的第二版。 - 内核版本:
Linux version 5.10.120说明内核版本为5.10.120,编译工具为gcc 9.4.0。 - 文件系统内容:
hostname、ssid、password等键值对表明存在一个配置文件,可能来自JFFS2或类似文件系统,包含设备主机名、无线SSID和明文密码——这些是安全审计时需重点关注的敏感信息。
验证方法
执行 strings -n 6 demo_fw.bin | grep -E "U-Boot|Linux version|hostname|ssid|password",若输出包含上述5类关键字符串,则说明提取与分析流程正确。若要验证偏移量显示功能,执行 strings -n 6 -t x demo_fw.bin | head -5,观察每行开头是否出现十六进制偏移地址。
常见问题
- 字符串过短未显示:
-n参数设置最小长度,若固件中有短字符串(如root),可降低阈值重新提取。 - 压缩/加密内容无法直接提取:
strings仅扫描原始字节。若固件包含压缩段(如内核、文件系统镜像),需先用binwalk等工具识别偏移和压缩类型,解压后再对解压后的数据执行strings。 - 误报与乱码:某些二进制数据可能恰好形成可打印序列,需结合上下文判断。若字符串区域集中在文件尾部且格式规整(如键值对),通常属于文件系统内容。