4、固件分析环境搭建:工欲善其事,必先利其器
做固件安全分析,环境搭建是第一步。说实话,这一步做不好,后面全是坑。我见过太多新手,上来就急着跑工具,结果环境没配好,折腾半天连个固件都解不开。
这一章,我会带你一步步搭好环境。别急,慢慢来。
核心要点:环境搭建不是一次性的,而是随着分析深入不断调整的。先搭好基础,后面再按需扩展。
4.1 Linux虚拟机环境配置(Ubuntu/Debian)
我个人习惯用Ubuntu 20.04 LTS。为什么?因为社区活跃,遇到问题好搜。Debian也行,但包稍微老一点。
安装步骤其实很简单:
- 下载Ubuntu 20.04 LTS镜像(官网就有)
- 用VirtualBox或VMware创建虚拟机
- 分配至少4GB内存,40GB硬盘
- 安装时选「最小安装」,省得装一堆用不上的软件
装完后,第一件事是换源。你想想看,默认源在国外,下载慢得要命。
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华源(以Ubuntu 20.04为例)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 更新
sudo apt update && sudo apt upgrade -y
小技巧:装完系统后,先装个openssh-server。这样你可以用SSH连进去操作,复制粘贴方便很多。
4.2 交叉编译工具链安装
固件分析中,交叉编译工具链是必须的。说白了,就是让你在x86的电脑上编译出ARM或MIPS架构的程序。
我遇到过最坑的事:有一次分析一个路由器固件,需要编译一个测试程序跑在目标设备上。结果工具链版本不对,编译出来的程序一跑就崩。折腾了两天才发现是glibc版本不匹配。
安装方法:
# ARM架构
sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf
# MIPS架构
sudo apt install gcc-mips-linux-gnu binutils-mips-linux-gnu
# 验证安装
arm-linux-gnueabihf-gcc --version
mips-linux-gnu-gcc --version
| 架构 | 工具链前缀 | 常见用途 |
|---|---|---|
| ARM (32位) | arm-linux-gnueabihf- | 路由器、IoT设备 |
| ARM (64位) | aarch64-linux-gnu- | 新式路由器、手机 |
| MIPS | mips-linux-gnu- | 老式路由器、交换机 |
| MIPSEL | mipsel-linux-gnu- | 部分家用路由器 |
注意:工具链的glibc版本必须与目标固件匹配。如果不匹配,编译出来的程序可能无法运行。我曾经就因为这个浪费了一整天。
4.3 QEMU用户态模拟与系统态模拟
QEMU是固件分析的神器。它有两种模式:用户态和系统态。
用户态模拟:只模拟CPU,不模拟整个系统。适合跑单个二进制文件。
系统态模拟:模拟整个硬件平台,包括CPU、内存、外设。适合跑完整的固件系统。
安装很简单:
sudo apt install qemu-user qemu-system
# 用户态模拟示例:运行ARM架构的二进制文件
qemu-arm -L /usr/arm-linux-gnueabihf ./hello_arm
# 系统态模拟示例:启动ARM架构的Linux内核
qemu-system-arm -M virt -kernel vmlinuz -initrd initrd.img
我个人建议:先学用户态模拟,简单好用。等需要分析完整固件时,再上系统态。
避坑指南:用户态模拟时,-L参数指定的是lib库路径。如果路径不对,程序会报「无法加载动态库」的错误。我曾经被这个坑过好几次。
4.4 GDB调试环境搭建
调试固件里的二进制文件,GDB是标配。但要注意,GDB也有交叉编译版本。
安装方法:
# 安装GDB
sudo apt install gdb
# 安装交叉编译版本的GDB(以ARM为例)
sudo apt install gdb-multiarch
# 或者单独安装
sudo apt install gdb-arm-linux-gnueabihf
调试示例:
# 启动GDB并连接QEMU用户态模拟的进程
qemu-arm -g 1234 ./vuln_program
# 另一个终端
gdb-multiarch ./vuln_program
(gdb) target remote localhost:1234
(gdb) break main
(gdb) continue
关键点:调试固件时,一定要确保GDB的架构与目标二进制文件一致。否则符号解析会出错,断点也打不上。
4.5 IDA Pro / Ghidra安装与配置
反编译工具,我两个都用。IDA Pro功能强大,但贵。Ghidra免费开源,功能也不差。
IDA Pro安装:
- 从官网下载安装包(需要购买许可证)
- 解压后运行./ida64即可
- 建议安装插件:Hex-Rays Decompiler(反编译插件,需要额外购买)
Ghidra安装:
# 需要Java 11+
sudo apt install openjdk-11-jdk
# 下载Ghidra(从官网)
wget https://ghidra-sre.org/ghidra_10.1.2_PUBLIC_20220125.zip
unzip ghidra_10.1.2_PUBLIC_20220125.zip
cd ghidra_10.1.2_PUBLIC
./ghidraRun
我个人习惯:用Ghidra做初步分析,用IDA Pro做深度逆向。Ghidra的脚本功能很强大,适合批量处理。IDA Pro的反编译质量更高,适合分析关键函数。
配置建议:Ghidra第一次启动会加载很多处理器模块,耐心等几分钟就好。如果卡住了,检查一下Java版本是不是太老。
4.6 本章知识体系
下面这张图,是我自己总结的环境搭建知识体系。你照着这个思路来,不会乱。
嗯,环境搭建这部分就这些了。别想着一次全搞定,先搭好虚拟机,装好工具链,能跑QEMU和GDB,就算入门了。后面用到什么再补什么。
我记得刚开始学的时候,光装Ghidra就折腾了半天。后来发现是Java版本不对。所以啊,遇到问题别慌,先检查版本和路径。
最后说一句:环境搭好了,后面分析固件才能顺风顺水。别嫌麻烦,这一步值得花时间。
公众号:蓝海资料掘金营,微信deep3321