第二章:固件分析环境搭建

做固件安全分析,说白了就是跟嵌入式设备「对话」。你得先听懂它的语言,才能找到它的漏洞。而搭建分析环境,就是准备这套「翻译工具」。

我刚开始搞固件分析那会儿,环境没搭好,折腾了整整两天。后来发现,其实只要按部就班来,半小时就能搞定。今天我就把这几步拆开揉碎了讲给你听。

2.1 Ubuntu虚拟机配置

我个人习惯用 Ubuntu 20.04 LTS 作为分析主机。为什么选这个版本?因为兼容性好,Ghidra、IDA Pro 这些工具跑起来最稳。我之前试过 22.04,结果某些老版本的 QEMU 编译报错,折腾半天。

虚拟机我推荐用 VMware Workstation 或者 VirtualBox。配置建议如下:

硬件 推荐配置 最低配置
CPU 4核 2核
内存 8GB 4GB
硬盘 80GB 40GB
网络 桥接模式 NAT模式
小提示:硬盘建议动态分配,别一开始就占满。我遇到过有人直接分配 200GB,结果宿主机硬盘不够用,尴尬得很。

安装完系统后,记得装几个必备包:

sudo apt update
sudo apt install build-essential git vim curl wget
sudo apt install python3 python3-pip
sudo apt install net-tools openssh-server

嗯,这里要注意:SSH 服务一定要开。因为很多时候我们会在宿主机上写脚本,然后远程到虚拟机里跑分析任务。不开 SSH,你就得来回切换窗口,效率低得可怜。

2.2 IDA Pro 与 Ghidra 安装

反汇编工具,我一般两套都装。IDA Pro 处理复杂逻辑时更顺手,Ghidra 则胜在免费且支持架构多。

IDA Pro 安装

IDA Pro 的安装其实很简单,但有个坑——路径不能有中文。我曾经帮一个学员远程调试,他装在「D:\软件\IDA Pro 7.7」下面,结果插件加载全失败。后来改成「D:\tools\ida77」就没事了。

安装步骤:

  1. 下载 IDA Pro 安装包(建议 7.5 以上版本)
  2. 运行安装程序,选择完整安装
  3. 将 license 文件放到安装目录下
  4. 配置 Python 环境(IDA 7.5+ 自带 Python 3)
警告:IDA Pro 的 Python 插件路径默认指向系统 Python。如果你用虚拟环境,记得手动改一下 idapython 的路径配置。不然 import 模块时会报错。

Ghidra 安装

Ghidra 是 NSA 开源的逆向工具,对固件分析特别友好。它需要 Java 11 以上环境。

# 安装 OpenJDK 11
sudo apt install openjdk-11-jdk

# 下载 Ghidra(建议从 GitHub Releases 下载)
wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_10.3.3_build/ghidra_10.3.3_PUBLIC_20231031.zip

# 解压到 /opt 目录
sudo unzip ghidra_*.zip -d /opt/
sudo mv /opt/ghidra_* /opt/ghidra

# 运行
/opt/ghidra/ghidraRun

我第一次用 Ghidra 时,觉得它启动慢。后来发现是 Java 堆内存设小了。你可以改一下 ghidraRun 脚本里的 -Xmx 参数,比如设成 -Xmx4G,启动速度会快很多。

2.3 QEMU 模拟环境搭建

QEMU 是固件分析的核心工具。它能模拟各种嵌入式 CPU 架构,比如 ARM、MIPS、PowerPC。说白了,就是把固件跑在你的电脑上,让你能动态调试。

安装 QEMU 很简单:

sudo apt install qemu-system-arm qemu-system-mips
sudo apt install qemu-user-static

这里我解释一下:qemu-system-* 是系统级模拟,可以跑整个操作系统;qemu-user-static 是用户态模拟,只跑单个二进制文件。做漏洞分析时,我们经常用用户态模拟,因为启动快、调试方便。

举个例子,假设你从思科路由器固件里提取出一个 httpd 二进制文件,想看看它有没有缓冲区溢出漏洞。你可以这样跑:

# 假设是 MIPS 架构
qemu-mips-static -L ./squashfs-root ./squashfs-root/usr/sbin/httpd

-L 参数指定根文件系统路径。为什么要指定?因为二进制文件运行时需要加载动态库,而这些库都在固件解压后的目录里。我曾经忘了加这个参数,结果程序直接段错误,排查了半天才发现是库没加载上。

核心要点:QEMU 用户态模拟的关键是 -L 参数。它告诉 QEMU 去哪里找动态链接库。没有它,大部分固件二进制都跑不起来。

2.4 GDB 调试器配置

GDB 是动态分析的灵魂。配合 QEMU 使用,可以单步调试固件里的二进制程序。

安装 GDB 多架构支持版:

sudo apt install gdb-multiarch

为什么不用默认的 gdb?因为默认 GDB 只支持本机架构(x86_64)。而我们要调试的是 ARM、MIPS 这些嵌入式架构的程序。gdb-multiarch 支持所有主流架构。

调试流程一般是这样的:

  1. 用 QEMU 启动目标程序,开启 GDB 远程调试端口
  2. 用 GDB 连接这个端口
  3. 设置断点、单步执行、查看内存

具体命令:

# 终端1:启动 QEMU 并等待 GDB 连接
qemu-mips-static -g 1234 -L ./squashfs-root ./squashfs-root/usr/sbin/httpd

# 终端2:启动 GDB 并连接
gdb-multiarch
(gdb) set architecture mips
(gdb) target remote localhost:1234
(gdb) break main
(gdb) continue

-g 1234 表示开启 GDB 调试端口 1234。你可以换成任意未占用的端口。

避坑指南:我曾经在调试一个 MIPS 程序时,发现断点打不上。后来才意识到,MIPS 架构的指令长度是 4 字节,而 GDB 默认按 2 字节对齐。需要手动设置 set mips abi o32 才能正常工作。

2.5 环境验证与测试

环境搭好了,怎么知道对不对?我一般会写一个简单的测试程序:

// test.c
#include <stdio.h>
int main() {
    printf("Hello from QEMU!\n");
    return 0;
}

交叉编译成 MIPS 架构:

# 安装交叉编译工具链
sudo apt install gcc-mips-linux-gnu

# 编译
mips-linux-gnu-gcc -static -o test_mips test.c

# 用 QEMU 运行
qemu-mips-static ./test_mips

如果输出 Hello from QEMU!,说明环境没问题。如果报错,检查一下 -L 参数或者库文件路径。

我个人习惯把测试程序放在 ~/tools/test_env/ 目录下,每次搭建新环境都跑一遍。省得后面分析固件时才发现工具链有问题,那就太晚了。

总结一下:这套环境的核心逻辑是「宿主机 + 虚拟机 + 模拟器 + 调试器」四层架构。宿主机负责管理,虚拟机提供 Linux 环境,QEMU 模拟嵌入式硬件,GDB 做动态分析。四者配合,就能对固件进行全方位的安全分析。
固件分析环境架构图 宿主机(Windows/Linux/macOS) VMware Workstation / VirtualBox Ubuntu 20.04 LTS 虚拟机 SSH 远程连接 | 文件共享 | 工具部署 分析工具层 IDA Pro(静态分析) | Ghidra(反编译) | QEMU(模拟执行) | GDB(动态调试) 思科固件(ARM / MIPS / PowerPC)
专注资料整理