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 最省心。

小提示:虚拟机内存至少给 4GB,硬盘 40GB 以上。Ghidra 分析大固件时挺吃内存的。

4.2 Ghidra安装与配置

Ghidra 是 NSA 开源的逆向工具,支持 MIPS 架构分析。说实话,它比 IDA Pro 在某些方面更好用——免费、可扩展、支持批量分析。

安装步骤其实不复杂:

  1. 下载 Ghidra 压缩包(我习惯用 10.x 版本)
  2. 解压到 /opt/ 目录下
  3. 确保系统安装了 JDK 17+
  4. 运行 ./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 的 -e 参数会递归提取,如果固件里有嵌套的压缩包,可能会生成大量文件。建议先 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% 的情况下够用了。

技巧:如果 file 命令识别不出来,可以试试 binwalk -B firmware.bin,它会扫描所有已知的 Magic Number,比 file 更全面。

4.6 知识体系总览

下面这张图,是我自己总结的固件逆向环境搭建的核心逻辑。你看一眼,心里就有数了。

固件逆向环境搭建 · 知识体系 固件逆向环境 Ubuntu 虚拟机 基础运行环境 Ghidra MIPS反汇编/反编译 binwalk 固件扫描与提取 hexdump + file 快速识别与定位 核心流程:识别 → 扫描 → 提取 → 反汇编 → 分析 文件类型识别 文件系统提取 MIPS反汇编 动态调试

4.7 实战:搭建完整环境

好了,理论说完了,咱们动手搭一遍。我按步骤来:

  1. 安装 Ubuntu 20.04:用 VirtualBox 或 VMware,分配 4GB 内存、2 核 CPU、40GB 硬盘
  2. 更新系统sudo apt update && sudo apt upgrade -y
  3. 安装 JDK 17sudo apt install openjdk-17-jdk -y
  4. 下载 Ghidra:从 GitHub Releases 页面下载,解压到 /opt/ghidra
  5. 安装 binwalk:用 GitHub 版本,sudo python3 setup.py install
  6. 验证工具:分别运行 ghidraRunbinwalk --helphexdump --versionfile --version

嗯,到这里环境就搭好了。你可能会问:为什么没有提 IDA Pro?说实话,IDA Pro 确实强大,但价格摆在那里。Ghidra 免费开源,功能上完全不输,而且社区活跃,插件丰富。

我记得刚开始做固件逆向时,环境搭了整整两天。各种依赖冲突、版本不兼容。现在回想起来,其实就是没找对方法。按照上面的步骤来,半小时内搞定。

最后说一句:环境搭好只是第一步。真正的挑战在后面——怎么分析 MIPS 指令、怎么识别函数、怎么还原逻辑。这些内容,咱们后面章节慢慢聊。


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