4、固件逆向环境搭建:Ubuntu虚拟机、Ghidra安装与配置、binwalk、hexdump、file命令
做固件逆向分析,说白了就是跟二进制打交道。你手里拿到的可能是一个 .bin 文件,也可能是一段从 Flash 里 dump 出来的裸数据。怎么下手?
我个人习惯,先把环境搭好。环境不对,后面全是白费功夫。今天咱们就把这套工具链捋一遍。
4.1 Ubuntu虚拟机:为什么选它?
我见过不少新手,直接在 Windows 上装各种逆向工具。结果呢?路径问题、权限问题、依赖冲突……折腾半天还没开始分析。
我的建议是:用 Ubuntu 虚拟机。原因很简单——
- 绝大多数固件分析工具都是 Linux 原生的
- 文件系统、权限管理、脚本执行,Linux 比 Windows 顺手太多
- 你可以在虚拟机里随便折腾,搞坏了也不影响宿主机
我个人用的是 Ubuntu 20.04 LTS,64位版本。你问为什么不是 22.04 或 24.04?嗯,20.04 的软件源更稳定,Ghidra 和 binwalk 的兼容性我踩过坑,20.04 最省心。
4.2 Ghidra安装与配置
Ghidra 是 NSA 开源的逆向工具,支持 MIPS 架构分析。说实话,它比 IDA Pro 在某些方面更好用——免费、可扩展、支持批量分析。
安装步骤其实不复杂:
- 下载 Ghidra 压缩包(我习惯用 10.x 版本)
- 解压到
/opt/目录下 - 确保系统安装了 JDK 17+
- 运行
./ghidraRun启动
这里有个坑——我曾经在 Ubuntu 上直接 apt install ghidra,结果装了个老版本,连 MIPS 的加载器都不全。所以,一定要从官网下载最新版。
关键配置:启动 Ghidra 后,进入 File -> Configure -> Analysis,把 MIPS 相关的分析选项全部勾上。尤其是 "MIPS Instruction Markup" 和 "MIPS Function ID",这两个能帮你省大量时间。
4.3 binwalk:固件分析的瑞士军刀
binwalk 这工具,我几乎每天都要用。它能做的事情太多了——
- 扫描固件中的文件系统(SquashFS、JFFS2、CramFS 等)
- 提取嵌入的固件镜像
- 识别 CPU 架构(MIPS、ARM、x86 等)
- 分析固件中的签名、校验和
安装很简单:
sudo apt install binwalk
# 或者从 GitHub 拉最新版
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo python3 setup.py install
我个人推荐用 GitHub 版本,因为 apt 里的 binwalk 版本太老,有些新固件的格式识别不了。
基本用法:
# 扫描固件
binwalk firmware.bin
# 提取所有文件
binwalk -e firmware.bin
# 只提取特定偏移的文件
binwalk -D 'squashfs:rootfs:squashfs' firmware.bin
我记得有一次分析某款路由器固件,binwalk 直接扫出了 3 个 SquashFS 文件系统。嗯,这就是典型的双固件备份结构。
binwalk firmware.bin 看看结构,再决定怎么提取。
4.4 hexdump:十六进制查看的利器
hexdump 这工具,看着简单,但用好了能帮你快速定位问题。我经常用它来——
- 查看固件头部(Magic Number、校验和等)
- 检查文件系统偏移
- 快速确认文件类型
常用参数:
# 查看前 256 字节
hexdump -C firmware.bin | head -n 16
# 从偏移 0x1000 开始查看
hexdump -s 0x1000 -C firmware.bin | head -n 20
# 只显示 ASCII 可打印字符
hexdump -C firmware.bin | grep -E '^.{60}[[:print:]]{16}$'
你可能会问:为什么不用 xxd 或者 od?其实都可以,但我个人习惯 hexdump -C,输出格式最清晰,左边是偏移,中间是十六进制,右边是 ASCII 字符。
举个例子,你拿到一个固件,先 hexdump -C firmware.bin | head,看到开头是 7f 45 4c 46——嗯,这是 ELF 文件。如果是 68 73 71 73,那就是 SquashFS 文件系统。这些 Magic Number 你得记熟。
4.5 file命令:快速识别文件类型
file 命令,看似简单,但它是逆向分析的第一步。你拿到一个未知文件,第一件事就是 file filename。
file firmware.bin
# 输出示例:firmware.bin: data
file rootfs.squashfs
# 输出示例:rootfs.squashfs: Squashfs filesystem, little endian, version 4.0
我遇到过的情况:客户给了一个 .bin 文件,说这是固件。我 file 一看,结果是 "gzip compressed data"。解压之后,再 file,变成 "Squashfs filesystem"。嗯,这就是典型的固件打包方式。
file 命令的识别原理是读取文件头部的 Magic Number,然后跟数据库比对。所以它不一定 100% 准确,但 90% 的情况下够用了。
binwalk -B firmware.bin,它会扫描所有已知的 Magic Number,比 file 更全面。
4.6 知识体系总览
下面这张图,是我自己总结的固件逆向环境搭建的核心逻辑。你看一眼,心里就有数了。
4.7 实战:搭建完整环境
好了,理论说完了,咱们动手搭一遍。我按步骤来:
- 安装 Ubuntu 20.04:用 VirtualBox 或 VMware,分配 4GB 内存、2 核 CPU、40GB 硬盘
- 更新系统:
sudo apt update && sudo apt upgrade -y - 安装 JDK 17:
sudo apt install openjdk-17-jdk -y - 下载 Ghidra:从 GitHub Releases 页面下载,解压到
/opt/ghidra - 安装 binwalk:用 GitHub 版本,
sudo python3 setup.py install - 验证工具:分别运行
ghidraRun、binwalk --help、hexdump --version、file --version
嗯,到这里环境就搭好了。你可能会问:为什么没有提 IDA Pro?说实话,IDA Pro 确实强大,但价格摆在那里。Ghidra 免费开源,功能上完全不输,而且社区活跃,插件丰富。
我记得刚开始做固件逆向时,环境搭了整整两天。各种依赖冲突、版本不兼容。现在回想起来,其实就是没找对方法。按照上面的步骤来,半小时内搞定。
最后说一句:环境搭好只是第一步。真正的挑战在后面——怎么分析 MIPS 指令、怎么识别函数、怎么还原逻辑。这些内容,咱们后面章节慢慢聊。
公众号:蓝海资料掘金营,微信deep3321