《固件安全升级实战演练》
第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系统下的二进制程序 |
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
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 ./ |
离线分析 |
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