2. 固件解包与文件系统提取

任务目标

给定一个路由器固件镜像(.bin),通过binwalk识别文件结构并提取其中的SquashFS文件系统,最终挂载该文件系统以查看内部文件(如配置文件、Web目录等)。本案例使用OpenWrt官方固件作为示例输入。

环境准备

  • 操作系统:Ubuntu 22.04+(或任何Linux发行版)
  • 所需工具:binwalk、unsquashfs、file、mount(需root权限)
  • 安装命令:sudo apt update && sudo apt install -y binwalk squashfs-tools

关键完整代码

#!/bin/bash
# firmware_extract.sh - 固件解包与文件系统提取脚本
# 用法: ./firmware_extract.sh <固件镜像路径>

set -e

FIRMWARE="$1"
WORKDIR="firmware_analysis"
EXTRACT_DIR="$WORKDIR/extracted"
SQUASHFS_DIR="$WORKDIR/squashfs-root"

if [ -z "$FIRMWARE" ]; then
    echo "错误: 请指定固件镜像路径"
    exit 1
fi

if [ ! -f "$FIRMWARE" ]; then
    echo "错误: 文件不存在: $FIRMWARE"
    exit 1
fi

# 创建分析目录
mkdir -p "$WORKDIR"
rm -rf "$EXTRACT_DIR" "$SQUASHFS_DIR"

echo "[1/4] 识别固件文件类型..."
file "$FIRMWARE"

echo "[2/4] 使用binwalk扫描固件结构..."
binwalk "$FIRMWARE" | tee "$WORKDIR/binwalk_scan.txt"

echo "[3/4] 提取固件内容..."
binwalk -e -M -C "$EXTRACT_DIR" "$FIRMWARE"

# 查找提取出的SquashFS文件系统
SQUASHFS_FILE=$(find "$EXTRACT_DIR" -name "*.squashfs" -o -name "squashfs-root" -type d | head -1)

if [ -z "$SQUASHFS_FILE" ]; then
    # 如果binwalk未自动解压,手动查找SquashFS偏移
    echo "尝试手动定位SquashFS文件系统..."
    OFFSET=$(binwalk "$FIRMWARE" | grep "Squashfs" | awk '{print $1}')
    if [ -z "$OFFSET" ]; then
        echo "错误: 未找到SquashFS文件系统"
        exit 1
    fi
    echo "找到SquashFS偏移: 0x$OFFSET"
    dd if="$FIRMWARE" of="$WORKDIR/rootfs.squashfs" bs=1 skip=$((16#$OFFSET)) 2>/dev/null
    SQUASHFS_FILE="$WORKDIR/rootfs.squashfs"
fi

echo "[4/4] 解压SquashFS文件系统..."
if [ -d "$SQUASHFS_FILE" ]; then
    # binwalk已自动解压为目录
    cp -r "$SQUASHFS_FILE" "$SQUASHFS_DIR"
else
    unsquashfs -d "$SQUASHFS_DIR" "$SQUASHFS_FILE"
fi

echo ""
echo "=== 提取完成 ==="
echo "文件系统位于: $SQUASHFS_DIR"
echo ""
echo "查看关键目录:"
ls -la "$SQUASHFS_DIR/etc/" 2>/dev/null | head -20
echo ""
echo "查看Web目录:"
ls -la "$SQUASHFS_DIR/www/" 2>/dev/null | head -20

运行方式

  1. 下载示例固件(约8MB):
    wget https://downloads.openwrt.org/releases/22.03.5/targets/ramips/mt7621/openwrt-22.03.5-ramips-mt7621-xiaomi_mi-router-4a-gigabit-squashfs-sysupgrade.bin
  2. 赋予脚本执行权限并运行:
    chmod +x firmware_extract.sh && sudo ./firmware_extract.sh openwrt-22.03.5-ramips-mt7621-xiaomi_mi-router-4a-gigabit-squashfs-sysupgrade.bin

验证方法与判定标准

  • binwalk扫描输出应包含类似 Squashfs filesystem, little endian, version 4.0 的行,表明固件中存在SquashFS文件系统。
  • 脚本执行成功后,firmware_analysis/squashfs-root/ 目录应存在,且包含 etc/、usr/、www/ 等典型Linux目录结构。
  • 查看关键文件:执行 cat firmware_analysis/squashfs-root/etc/openwrt_release 应输出OpenWrt版本信息,证明文件系统内容可正常读取。
  • 可选挂载验证(需root):
    mkdir -p /mnt/fw && mount -t squashfs -o loop,ro firmware_analysis/rootfs.squashfs /mnt/fw && ls /mnt/fw/etc/
    挂载成功后应能看到与解压目录一致的文件列表。

常见问题

  • binwalk未识别SquashFS:某些固件使用非标准偏移或自定义头部,可尝试 binwalk -A 或手动用 dd 按已知偏移截取。
  • unsquashfs报错:确认固件使用SquashFS v4.0(OpenWrt默认),旧版v3需安装 squashfs-tools-legacy。
  • 权限不足:挂载操作需要root权限,解压操作建议使用普通用户避免污染系统文件。
固件解包与文件系统提取流程 固件镜像 .bin 文件 binwalk 扫描 识别文件结构/偏移 binwalk -e 提取 自动解压已知类型 定位 SquashFS 文件系统 find / dd 按偏移截取 手动 dd 截取 dd if=fw bs=1 skip=偏移 unsquashfs 解压 squashfs-root/ unsquashfs 解压 squashfs-root/ 查看 /etc /www 等内部文件 输入 分析 自动提取