第二章:固件分析环境搭建
做固件安全分析,说白了就是跟嵌入式设备「对话」。你得先听懂它的语言,才能找到它的漏洞。而搭建分析环境,就是准备这套「翻译工具」。
我刚开始搞固件分析那会儿,环境没搭好,折腾了整整两天。后来发现,其实只要按部就班来,半小时就能搞定。今天我就把这几步拆开揉碎了讲给你听。
2.1 Ubuntu虚拟机配置
我个人习惯用 Ubuntu 20.04 LTS 作为分析主机。为什么选这个版本?因为兼容性好,Ghidra、IDA Pro 这些工具跑起来最稳。我之前试过 22.04,结果某些老版本的 QEMU 编译报错,折腾半天。
虚拟机我推荐用 VMware Workstation 或者 VirtualBox。配置建议如下:
| 硬件 | 推荐配置 | 最低配置 |
|---|---|---|
| CPU | 4核 | 2核 |
| 内存 | 8GB | 4GB |
| 硬盘 | 80GB | 40GB |
| 网络 | 桥接模式 | NAT模式 |
安装完系统后,记得装几个必备包:
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」就没事了。
安装步骤:
- 下载 IDA Pro 安装包(建议 7.5 以上版本)
- 运行安装程序,选择完整安装
- 将 license 文件放到安装目录下
- 配置 Python 环境(IDA 7.5+ 自带 Python 3)
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 参数指定根文件系统路径。为什么要指定?因为二进制文件运行时需要加载动态库,而这些库都在固件解压后的目录里。我曾经忘了加这个参数,结果程序直接段错误,排查了半天才发现是库没加载上。
-L 参数。它告诉 QEMU 去哪里找动态链接库。没有它,大部分固件二进制都跑不起来。
2.4 GDB 调试器配置
GDB 是动态分析的灵魂。配合 QEMU 使用,可以单步调试固件里的二进制程序。
安装 GDB 多架构支持版:
sudo apt install gdb-multiarch
为什么不用默认的 gdb?因为默认 GDB 只支持本机架构(x86_64)。而我们要调试的是 ARM、MIPS 这些嵌入式架构的程序。gdb-multiarch 支持所有主流架构。
调试流程一般是这样的:
- 用 QEMU 启动目标程序,开启 GDB 远程调试端口
- 用 GDB 连接这个端口
- 设置断点、单步执行、查看内存
具体命令:
# 终端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。你可以换成任意未占用的端口。
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/ 目录下,每次搭建新环境都跑一遍。省得后面分析固件时才发现工具链有问题,那就太晚了。