《固件安全升级实战演练》
第3章 固件逆向分析基础

3、固件逆向分析基础

固件逆向分析是嵌入式安全研究的核心技能。本章节将系统讲解三大基础操作:binwalk工具使用、固件解包与打包、固件文件系统挂载。通过实战演练,掌握从固件中提取文件系统、分析文件结构、修改后重新打包的完整流程。

3.1 binwalk工具使用

binwalk是固件分析中最常用的工具,能够自动识别固件中的文件签名、文件系统、压缩数据等。其核心原理是通过魔数签名匹配来定位文件边界。

3.1.1 基本用法

# 扫描固件中的文件签名
binwalk firmware.bin

# 详细扫描(显示偏移量和描述)
binwalk -Me firmware.bin

# 提取所有识别到的文件
binwalk -e firmware.bin

# 递归提取(解包嵌套文件系统)
binwalk -Me firmware.bin

3.1.2 常见签名识别

签名魔数 文件类型 说明
1F 8B 08 gzip压缩 常见于固件内核或文件系统
42 5A 68 bzip2压缩 部分嵌入式系统使用
89 50 4E 47 PNG图片 固件中的Logo或UI资源
55 AA MBR分区表 存储设备分区信息
7F 45 4C 46 ELF可执行文件 Linux系统下的二进制程序
binwalk 固件扫描流程 firmware.bin 原始固件 binwalk 签名匹配引擎 魔数识别 + 偏移定位 扫描结果 偏移量 0x0: uImage 头 偏移量 0x40: gzip 压缩数据 偏移量 0x1A0: SquashFS 文件系统 提取文件 _firmware.bin.extracted/ ├─ squashfs-root/

3.2 固件解包与打包

固件解包是将固件中的文件系统提取出来,打包则是将修改后的文件系统重新封装为固件。不同固件格式有不同的解包打包工具。

3.2.1 常见固件格式与工具

固件格式 解包工具 打包工具 典型应用
SquashFS unsquashfs mksquashfs OpenWrt、路由器固件
CramFS cramfsck -x mkcramfs 旧版嵌入式Linux
JFFS2 jefferson mkfs.jffs2 闪存文件系统
UBIFS ubireader_extract mkfs.ubifs NAND Flash设备
TRX/CHK binwalk -e 自定义脚本 Broadcom/TP-Link固件

3.2.2 实战:SquashFS解包与打包

# 解包SquashFS文件系统
unsquashfs -d ./squashfs-root squashfs.img

# 修改文件系统内容(例如修改启动脚本)
vim ./squashfs-root/etc/init.d/rcS

# 重新打包为SquashFS
mksquashfs ./squashfs-root new_squashfs.img -comp xz -b 131072

# 验证打包结果
binwalk new_squashfs.img
固件解包与打包流程 解包流程 固件镜像 firmware.bin binwalk -e unsquashfs 文件系统目录 squashfs-root/ ✏️ 修改文件内容 打包流程 修改后目录 squashfs-root/ mksquashfs -comp xz -b 131072 新固件镜像 new_firmware.bin

3.3 固件文件系统挂载

挂载文件系统可以让我们像操作普通目录一样访问固件内容,便于分析和修改。常用的挂载方式包括loop设备挂载和FUSE挂载。

3.3.1 使用loop设备挂载

# 创建挂载点
mkdir -p /mnt/firmware

# 查找文件系统偏移量(使用binwalk)
binwalk firmware.bin | grep "SquashFS"

# 挂载SquashFS文件系统(假设偏移量为0x1A0)
mount -o loop,offset=$((0x1A0)) firmware.bin /mnt/firmware

# 查看文件系统内容
ls -la /mnt/firmware/

# 卸载文件系统
umount /mnt/firmware

3.3.2 使用FUSE挂载(无需root权限)

# 安装squashfuse
apt-get install squashfuse

# 挂载SquashFS文件系统
squashfuse squashfs.img /mnt/firmware

# 访问文件系统
cat /mnt/firmware/etc/version

# 卸载
fusermount -u /mnt/firmware

3.3.3 挂载后的典型分析操作

操作 命令示例 目的
查看启动脚本 cat /mnt/firmware/etc/init.d/rcS 分析系统启动流程
查找硬编码密码 grep -r "password" /mnt/firmware/etc/ 安全审计
分析Web服务 ls -la /mnt/firmware/www/ 查找Web漏洞
提取二进制程序 cp /mnt/firmware/bin/busybox ./ 离线分析
文件系统挂载架构 固件镜像层 firmware.bin (包含SquashFS文件系统) 挂载层 mount -o loop,offset=0x1A0 / loop设备 / FUSE 文件系统层(/mnt/firmware) ├── bin/ ├── etc/ ├── lib/ ├── usr/ ├── www/ └── var/ 🔍 分析操作 查看/修改/提取 grep/cp/vim

3.4 综合实战案例:路由器固件分析

以下是一个完整的固件逆向分析流程,综合运用了binwalk、解包打包和文件系统挂载技术。

# 步骤1:扫描固件
binwalk -Me router_firmware.bin

# 步骤2:查看扫描结果
# 输出显示:
# DECIMAL       HEXADECIMAL     DESCRIPTION
# 0             0x0             uImage header
# 64            0x40            LZMA compressed data
# 1310720       0x140000        SquashFS filesystem

# 步骤3:挂载SquashFS文件系统
mount -o loop,offset=$((0x140000)) router_firmware.bin /mnt/firmware

# 步骤4:分析关键文件
cat /mnt/firmware/etc/shadow
cat /mnt/firmware/etc/config/dropbear
ls -la /mnt/firmware/usr/sbin/

# 步骤5:提取并修改文件
cp /mnt/firmware/etc/config/dropbear ./dropbear_backup
echo "option PasswordAuth 'off'" >> /mnt/firmware/etc/config/dropbear

# 步骤6:卸载并重新打包
umount /mnt/firmware
mksquashfs /mnt/firmware modified_squashfs.img -comp xz

# 步骤7:生成新固件(需要替换原固件中的文件系统)
# 使用dd命令替换文件系统部分
dd if=modified_squashfs.img of=new_firmware.bin bs=1 seek=$((0x140000)) conv=notrunc
综合实战流程 步骤1 binwalk -Me 扫描固件签名 步骤2 mount -o loop 挂载文件系统 步骤3 分析/修改 cat / grep / vim 步骤4 重新打包 mksquashfs ✅ 完成固件逆向分析 成功提取、分析、修改并重新打包固件 ⚠️ 注意:固件修改后需验证完整性,避免设备变砖