环境搭建:工欲善其事,必先利其器

做固件安全分析,说白了就是跟各种二进制文件打交道。你想想看,没有趁手的工具,就像拿着螺丝刀拆航天飞机——不是不能干,是效率太低。我个人习惯先把环境搭得舒舒服服的,后面分析起来才顺手。

这一章,我带你把整个工作台支棱起来。咱们要装的东西不少,但别怕,一步步来。

1. Linux虚拟机安装

为什么非得用Linux?因为大部分固件分析工具都是Linux原生的。Windows上也能跑,但坑太多。我建议直接用Ubuntu 20.04 LTS,稳定,社区活跃,遇到问题一搜就有答案。

我的推荐配置:

  • VMware Workstation 或 VirtualBox(免费版够用)
  • Ubuntu 20.04 LTS 桌面版
  • 内存至少8GB,硬盘60GB+
  • CPU核心数给2-4个

安装过程我就不啰嗦了,网上教程一大把。但有一点我要强调:记得安装VMware Tools或增强功能。我曾经因为没装这个,复制粘贴都成问题,折腾了半小时才发现是这回事。

小技巧:装完系统后,先执行 sudo apt update && sudo apt upgrade -y,把系统更新到最新。很多依赖问题都是因为源太旧引起的。

2. Binwalk:固件分析的瑞士军刀

Binwalk这工具,你迟早会爱上它。它能做的事情很简单:把固件拆开。不管是文件系统、内核镜像还是引导程序,它都能识别并提取出来。

安装方式有两种:

# 方法一:apt安装(推荐,省心)
sudo apt install binwalk

# 方法二:源码安装(最新版)
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo python3 setup.py install

我个人推荐用源码安装。为什么?因为apt源里的版本往往比较老,有些新固件的格式识别不了。我在分析某款路由器固件时就遇到过这问题——apt装的binwalk死活解不开,换成最新版一次搞定。

装完后,试试这个命令:

binwalk -Me firmware.bin

-M 是递归提取,-e 是自动解压。一条命令,固件里的文件系统、内核、配置文件全给你扒出来。

注意:Binwalk依赖很多外部工具(如sasquatch、jefferson等)。如果遇到解压失败,八成是某个依赖没装。运行 binwalk --help 看看缺了什么,然后手动补上。

3. Firmadyne:固件模拟运行环境

光把固件拆开还不够,有时候你得让它跑起来。Firmadyne就是干这个的——它用QEMU模拟一个完整的嵌入式设备环境,让你能在PC上调试固件。

安装步骤稍微复杂点:

# 1. 克隆项目
git clone https://github.com/firmadyne/firmadyne.git
cd firmadyne

# 2. 安装依赖
sudo apt install -y python3-pip python3-dev \
  qemu-system-arm qemu-system-mips qemu-system-x86 \
  binwalk busybox-static

# 3. 下载并编译内核
./download.sh
./build.sh

这里有个坑:download.sh 会从网上下载预编译的内核镜像。如果网络不好,可能会卡住。我建议你提前准备好梯子,或者手动下载后放到 ./images/ 目录下。

装完后,用Firmadyne跑固件的基本流程是:

# 1. 先识别固件架构
python3 scripts/getArch.py firmware.bin

# 2. 创建镜像
python3 scripts/makeImage.py firmware.bin [架构]

# 3. 启动模拟
python3 scripts/run.sh [镜像ID]

经验之谈:Firmadyne不是万能的。有些固件启动时会卡在某个驱动初始化上。这时候别慌,试试修改 scratch/ 目录下的配置文件,关掉一些不必要的硬件模拟。

4. Ghidra:逆向分析的核武器

Ghidra是美国NSA开源的逆向工程工具。说实话,我第一次用的时候也被震住了——免费、功能强大、还支持插件扩展。IDA Pro能做的,它基本都能做,而且还不花钱。

安装前,确保你有Java 11+:

sudo apt install openjdk-11-jdk
java -version  # 确认版本

然后去Ghidra官网下载压缩包,解压就能用:

wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_10.3.3_build/ghidra_10.3.3_PUBLIC_20231001.zip
unzip ghidra_10.3.3_PUBLIC_20231001.zip
cd ghidra_10.3.3_PUBLIC
./ghidraRun

启动后,你会看到一个图形界面。别被它吓到,核心操作就几个:

  • 创建项目:File → New Project
  • 导入文件:拖拽二进制文件到项目窗口
  • 自动分析:双击文件,Ghidra会自动识别架构、函数、字符串
  • 反编译:按 F5 或右键 → Decompile

我的习惯:每次分析新固件,我都会先跑一遍Ghidra的自动分析,然后看反编译出来的C代码。这比直接看汇编快多了。尤其是找漏洞时,盯着反编译代码里的 memcpysprintf 这些危险函数,一抓一个准。

5. QEMU:硬件模拟的基石

QEMU是Firmadyne的底层引擎,但也可以单独使用。有时候你只想跑一个单独的二进制文件,而不是整个固件,这时候QEMU就派上用场了。

安装很简单:

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

注意,我装了四个包:

  • qemu-system-*:模拟完整系统
  • qemu-user-static:用户态模拟,可以跑单个二进制文件

举个例子,你从路由器固件里提取出一个MIPS架构的Web服务程序,想看看它怎么处理HTTP请求:

# 用QEMU用户态模拟运行
qemu-mips-static ./httpd -p 8080

这样就能在x86的PC上直接运行MIPS的程序。是不是很神奇?

注意:用户态模拟有个限制——它只能跑用户空间的代码。如果程序需要访问硬件寄存器或内核驱动,那就得用系统态模拟了。这时候Firmadyne更合适。

6. 工具链关系图

说了这么多,你可能有点晕。这些工具之间到底是什么关系?我画了张图,一看就明白:

固件分析工具链关系图 固件文件 (.bin) Binwalk:固件拆解与文件提取 提取出的文件系统/内核/二进制 Ghidra:静态逆向分析 QEMU:单文件模拟运行 Firmadyne:完整固件模拟

这张图很清楚地展示了工作流程:固件 → Binwalk拆解 → 提取文件 → 根据需求选择Ghidra/QEMU/Firmadyne。实际分析中,这三个工具经常配合使用。比如先用Ghidra找到漏洞点,然后用QEMU跑起来验证。

7. 环境验证清单

装完所有工具后,我建议你做个快速验证。别等到分析时才发现某个工具没装好,那就尴尬了。

工具 验证命令 预期输出
Binwalk binwalk --version 显示版本号
Firmadyne python3 scripts/makeImage.py -h 显示帮助信息
Ghidra 启动后导入一个ELF文件 能正常反编译
QEMU qemu-arm-static --version 显示版本号

最后说一句:环境搭建是最枯燥但最重要的一步。我见过太多人,工具没装好就急着分析固件,结果卡在某个步骤上,浪费大量时间。花半天时间把环境搭扎实,后面能省你一周的功夫。

好了,工具都装好了。下一章,我们拿一个真实的路由器固件练练手,看看这些工具到底怎么用。


公众号:蓝海资料掘金营,微信deep3321