Ghidra 软件逆向工程入门 第 1 章 Ghidra 入门指南

本书内容涵盖

第 1 章 , Ghidra 入门指南 ,将带您了解 Ghidra 平台及其发展历史,涵盖安装流程以及从 用户视角 对该程序的基本概述。

第 2 章 , 使用 Ghidra 脚本自动化逆向工程任务 ,探讨如何利用 Ghidra 的脚本功能实现逆向工程任务自动化,并介绍 脚本开发 的相关内容。

第 3 章 , Ghidra 调试模式 ,深入讲解如何搭建 Ghidra 开发环境、调试 Ghidra 的方法,以及有关 Ghidra 调试 模式漏洞 的详细信息。

第 4 章 , 使用 Ghidra 扩展 ,为您提供开发 Ghidra 扩展的背景知识,并展示如何安装及 使用它们。

第 5 章 , 使用 Ghidra 逆向分析恶意软件 ,通过逆向分析真实世界的 恶意软件样本,演示如何利用 Ghidra 进行恶意软件分析。

第 6 章 , 恶意软件分析脚本编写 ,教您如何使用 Java 和 Python 脚本自动化恶意软件分析。 本章基于前一章内容,提供用于分析 恶意软件样本中 shellcode 的脚本。

第 7 章 , 使用 Ghidra 无头分析器 ,阐述了如何以无头模式运行 Ghidra 进行自动化批处理,并利用本章开发的脚本分析恶意软件样本。

第 8 章 , 二进制差异分析 ,详细介绍了 Ghidra 的 BSim 功能,包括如何设置并使用它进行分析。 本章涵盖了比较二进制文件以识别变更、分析补丁及 发现漏洞的技术。

第 9 章 , 审计程序二进制文件 ,介绍了如何使用 Ghidra 发现内存损坏漏洞以及 如何利用这些漏洞。

第 10 章 , 二进制审计脚本编写 ,延续前一章内容,教授如何利用强大的 PCode 中间表示通过脚本实现漏洞挖掘流程自动化。

第 11 章 , Ghidra 插件开发 ,深入讲解如何创建定制插件来扩展 Ghidra 功能,使其适应特定的 逆向工程需求。

第 12 章 , 支持新二进制格式 ,通过真实案例演示如何在 Ghidra 中添加对新型及自定义二进制格式的支持,从而扩展 分析范围。

第 13 章 , 分析处理器模块 ,探讨了如何使用 SLEIGH 处理器规范语言编写 Ghidra 处理器模块。

第 14 章 , 参与 Ghidra 社区贡献 ,介绍了如何通过社交网络、聊天工具与社区互动,以及如何通过自主开发、反馈、漏洞报告、评论等方式为社区 做出贡献。

第 15 章 , 扩展 Ghidra 进行高级逆向工程 —— 工程 ,介绍了高级逆向工程主题和工具,如 SMT 求解器、Microsoft Z3、静态与动态符号执行、LLVM 和 Angr,并阐述了如何将它们 与 Ghidra 集成。

第 16 章 , 调试 ,详细讲解了 Ghidra 调试工具并概述了多种调试策略。 同时描述了不同的调试模式,包括远程调试和内核调试,用于分析复杂代码 执行场景。

第 17 章 , 实战恶意软件解包分析 ,将指导您如何解包和分析真实世界中的恶意软件样本,揭示 威胁行为体 所使用的技术。

第 18 章 , 勒索软件逆向工程 ,深入分析勒索软件以理解其内部机制。 本章还概述了勒索软件使用的加密技术,以及 使用 Ghidra 识别加密算法的方法。

在本介绍性章节中,我们将从多个方面概述 Ghidra 。 在开始之前, 了解如何获取和安装该程序会很有帮助。 如果您想安装程序的发行版本,这显然是简单且微不足道的。 不过,您可能想深入了解这个程序。 若是如此,我可以提前告诉您,您可以从 源代码 自行编译该程序。

由于 Ghidra 的源代码是开放的,可以修改和扩展,您可能也会对其代码结构、存在的代码类型等方面感兴趣。 这是探索 Ghidra 所提供的巨大可能性的绝佳机会。

从逆向工程师的角度审视 Ghidra 的主要功能也颇有趣味。 该工具的特异之处定能激发您的兴趣,而这正是 Ghidra 最引人入胜的 特质所在。

本章我们将涵盖以下 核心主题:

  • 维基解密 穹顶 7
  • Ghidra 与 IDA 及诸多 其他竞品的对比
  • Ghidra 概述

维基解密 Vault 7

2017 年 3 月 7 日,维基解密开始披露 Vault 7 文件,这成为美国中央情报局机密文件的最大泄密事件 CIA)。 此次泄露包含了 24 个部分的秘密网络武器和间谍技术,分别命名为:Year Zero、Dark Matter、Marble、Grasshopper、HIVE、Weeping Angel、Scribbles、Archimedes、AfterMidnight、Assassin、Athena、Pandemic、Cherry Blossom、Brutal Kangaroo、Elsa、OutlawCountry、BothanSpy、Highrise、UCL/Raytheon、Imperial、Dumbo、CouchPotato、ExpressLane、Angelfire、 以及 Protego。

据信这些 CIA 机密文件是由美国国家安全局情报官员泄露的,但这一说法从未得到 2006 年至 2009 年间任职的 CIA 局长迈克尔·文森特·海登的官方确认或否认。

Ghidra 的存在在"Vault 7: Year Zero"第一部分中被泄露。 这部分内容包含从位于弗吉尼亚州兰利的中央情报局网络情报中心窃取的大量文件和文档。 泄露内容涉及中情局的恶意软件库和零日武器化漏洞,以及如何将苹果 iPhone、谷歌 Android、微软 Windows 设备甚至三星电视变成 隐蔽麦克风。

Ghidra 在此次泄露中被提及三次( https://wikileaks.org/ciav7p1/cms/index.html ),展示了如何安装它、使用 Ghidra 对 64 位内核缓存进行手动分析的分步教程(含截图),以及当时可用的最新 Ghidra 版本,即 Ghidra 7. 0.2.

NSA 发布

正如在旧金山举行的 2019 年 RSA 大会上宣布的那样, 美国国家安全局(NSA)网络安全高级顾问 Rob Joyce 在一个名为 获取免费的 NSA 逆向工程工具 的环节中 解释了 Ghidra 的独特功能 并发布了 Ghidra 程序二进制文件。

在此次 会议中,讲解了一些 功能特性:

  • 团队在单个 项目上的协作功能
  • 扩展和 规模化 Ghidra 的能力
  • 通用处理器模型,也被 称为 SLEIGH
  • 两种工作模式:交互式 和非图形界面
  • Ghidra 强大的分析功能

最终,在 2019 年 4 月 4 日,美国国家安全局(NSA) 于 GitHub 上发布了 Ghidra 的源代码(https://github.com/NationalSecurityAgency/ghidra),同时也在 Ghidra 官网上提供了可直接使用的发布版本下载(https://ghidra-sre.org)。 该网站首次提供的 Ghidra 版本为 9.0。 根据所在国家/地区不同,Ghidra 官网可能对非美国访客开放访问限制;若遇此情况,可通过 VPN 或在线代理服务(例如 HideMyAss(https://www.hidemyass.com/))进行访问。

令美国国家安全局(NSA)遗憾的是,几小时后,首个 Ghidra 漏洞于 2019 年 3 月 6 日凌晨 1 点 20 分由 Matthew Hickey(又名 @hackerfantastic)公开披露。 他通过 X 平台( 原 Twitter)发表了以下声明:

Ghidra 在调试模式下会开放 JDWP 端口 18001,可被利用进行远程代码执行(捂脸表情)。 修复方法:将 support/launch.sh 第 150 行的*改为 127.0.0.1https://github.com/hackerhouse-opensource/exploits/blob/master/jdwp-exploit.txt .

随后, 关于 NSA 和 Ghidra 的诸多质疑接踵而至。 但考虑到 NSA 的网络间谍能力,你认为 NSA 真的需要在自家软件中植入后门才能入侵用户吗?

显然不是。 他们不需要这样做,因为他们已经拥有网络武器 来达成目的。

使用 Ghidra 时你可以放心;或许,NSA 只是想通过做些体面的事来改善自身形象。 既然 Ghidra 的存在已被维基解密曝光,还有什么比在 RSA 大会上发布并将其开源 更好的方式呢?

Ghidra 与 IDA 及其他众多竞争产品的比较

即 便你已 经掌握了强大的逆向工程框架,比如 Interactive Disassembler  IDA )、 Binary Ninja 或 Radare2 ,仍有充分理由开始 学习 Ghidra。

没有任何一个 逆向工程框架是终极解决方案。 每个 逆向工程框架都有其优缺点。 有些甚至无法直接比较,因为 它们基于不同的设计理念(例如基于 GUI 的框架与基于命令 行的框架)。

另一方面,你会看到这些产品始终在相互竞争并借鉴彼此。 例如,IDA Pro 7.3 引入了 撤销 功能,该功能此前已由它的 竞争对手 Ghidra 实现

在下面的截图中,你可以看到充满史诗感和幽默感的 @GHIDRA_RE 官方 X(原 Twitter)账号对 IDA Pr o 撤销 功能的回应:

图 1.1 – IDA Pro 7.3 新增撤销功能以与 Ghidra 竞争

由于竞争关系,各框架间的差异可能发生变化,但我们可以列举 Ghidra 当前的一些优势:

  • 它是开源且免费的(包括 其反编译器)。
  • 它支持多种架构(您当前使用的框架可能尚未 支持这些架构)。
  • 它能加载 项目中的多个二进制文件。 这一功能让您可以轻松对多个相关二进制文件(例如可执行文件及其 库文件)进行操作。
  • 它通过 设计实现了 协同逆向工程 功能。
  • 它能完美支持 大型固件镜像(1GB 以上)。
  • 它拥有完善的 文档资料,包含示例 和教程。
  • 它支持二进制文件的版本追踪,使您能够在不同版本的 二进制文件之间匹配函数、数据及其标记。

总之,建议尽可能多地学习各种框架,以了解并利用每个框架的优势。 从这个角度来看,Ghidra 是一个强大的框架, 您 必须掌握。

Ghidra 概述

类似于 RSA 大会上的展示方式,我们将提供 Ghidra 的概 览, 介绍该工具及其功能。 您很快就会发现 Ghidra 的强大之处,以及为什么这个工具不仅仅是又一个开源的 逆向工程 框架。

在撰写本书时,Ghidra 的最新可用版本是 11.0.1,可从本章前一节提到的 官方网站下载。

注意

建议读者在学习本书中的练习时, 下载相同版本的 Ghidra 及其他相关软件。

安装 Ghidra

建议下载 Ghidra 的最新版本(https://ghidra-sre.org/),点击红色 Download from GitHub 按钮,这将跳转至 GitHub 上的 Ghidra 发布页面,您可在此找到包括历史版本在内的所有已发布版本:

 

图 1.2 - 从官方网站下载 Ghidra

点击下载按钮将跳转至 GitHub 发布页面,如下图所示。 在 Assets 部分,您将看到下载 GhidraZIP 压缩包的链接:

 

图 1.3 – Ghidra 的 GitHub 发布页面

下载 Ghidra 压缩包文件( ghidra_11.0.1_PUBLIC_20240130.zip )并解压后,您将看到以下 文件结构:

 

图 1.4 – Ghidra 11.0.1 解压后的目录结构

内容可描述为 如下( https://ghidra-sre.org/InstallationGuide.html ):

  • 文档 :包含 Ghidra 文档及一些极其有用的资源,例如面向各级用户的学习课程、速查表,以及逐步的 安装指南
  • 扩展功能 :可选的 Ghidra 扩展,允许您增强其功能并实现与 其他工具 的集成
  • Ghidra : Ghidra 主程序
  • GPL : 独立的 GPL 支持程序
  • licenses : 包含 Ghidra 使用的许可证
  • server : 包含与 Ghidra 服务器安装 和管理相关的文件
  • support :允许您以高级模式运行 Ghidra 并控制其启动方式,包括将其启动为 调试模式
  • ghidraRun :用于在 Linux 和 iOS 上启动 Ghidra 的脚本
  • ghidraRun.bat :批处理脚本,允许您在 Windows 上 启动 Ghidra
  • LICENSE :Ghidra 许可证文件
  • bom.json :这是 软件物料清单  SBOM )文件,采用 CycloneDX JSON 格式列出了构成 Ghidra 软件的所有组件或库;它有助于理解 该 项目 的依赖关系

除了下载预编译的 Ghidra 发行版本外,您也可以按照 下一节 所述自行编译程序

自行编译 Ghidra

要自行构建 Ghidra,您需要按照 Ghidra GitHub 仓库 构建 部分的说明进行操作( 详见: https://github.com/NationalSecurityAgency/ghidra?tab=readme-ov-file#build )。

第一步是安装以下 构建工具:

正确安装构建工具后,请从 https://github.com/NationalSecurityAgency/ghidra/archive/refs/heads/master.zip 下载并解压源代码,或使用以下 Git 命令克隆 代码仓库:

> git clone https://github.com/NationalSecurityAgency/ghidra.git

然后进入解压或克隆的目录,使用 Gradle 构建 Ghidra。 以下是需要 执行的命令列表:

> gradle -I gradle/support/fetchDependencies.gradle init
> gradle buildGhidra

构建完成后,您将看到 BUILD SUCCESSFUL 消息,如下图所示:

图1.5 – 构建成功消息

这将生成 一个包含 Ghidra 编译版本的 压缩文件:

/ghidra/build/dist/ghidra_*.zip

运行 Ghidra

在 启动 Ghidra 之前,请确保您的计算机满足 以下要求:

  • 硬件配置:
    • 4 GB 内存
    • 1 GB 存储空间(用于安装 Ghidra 二进制文件)
    • 双显示器( 强烈推荐)
  • 软件:
    • Java 17 64 位运行时及 开发工具包

由于 Ghidra 是用 Java 编写的,如果在安装 Java 17 64 位运行时环境和开发工具包之前运行,可能会出现以下错误信息:

  • 当未安装 Java 时,您将看到 以下内容:
    
    "Java runtime not found..."
  • 当 Java Development Kit JDK ) 缺失时, 您会看到 以下内容:

图 1.6 – 缺失 JDK 错误

因此,如果您 收到这些提示信息,请从 https://adoptium.net/en-GB/temurin/releases/?os=windows&arch=x64&package=jdk&version=17 下载 JDK .

如何解决安装问题

Ghidra 的逐步安装指南(包括已知问题)可在 Ghidra 文档目录中找到 ,路径为 docs\InstallationGuid e.html .

该指南也可在线访问 : https://htmlpreview.github.io/?https://github.com/NationalSecurityAgency/ghidra/blob/master/GhidraDocs/InstallationGuide.html .

请注意,您可以在以下地址报告发现的新问题 : https://github.com/NationalSecurityAgency/ghidra/issues .

安装 Ghidra 后,您可以通过 ghidraRun 在 Linux 和 macOS 上启动,或使用 ghidraRun.bat 在 Windows 上启动。

Ghidra 功能 概述

在本节中,我们将 概述 Ghidra 的一些基本功能,以便理解该程序的整体功能。 这也是熟悉 它的良好起点。

创建新的 Ghidra 项 目

正如您 将注意到的,与其他逆向工程工具不同,Ghidra 并不直接操作文件。 相反,Ghidra 以项目为单位工作。 让我们通过点击 文件 新建项目... 来创建一个新项目。 您也可以通过按下快捷键 Ctrl 更快地完成此操作(Ghidra 的完整快捷键列表可在 https://ghidra-sre.org/CheatSheet.html 以及 Ghidr a 的 文档目录中找到):

 

此外,项目可分为非共享与共享两种类型。 由于我们需要分析一个 hello world 程序且无需与其他逆向工程师协作,因此选择非共享项目 ,随后点击 Next>> 按钮。 接着程序会要求输入项目名称(helloworld)并选择存储位置: 

图1.8 – 选择项目名称和目录

该项目由一个 hello world.gpr 文件、一个 以及 hello world.rep 文件夹组成:

 

图 1.9 – Ghidra 项目结构

一个 Ghidra 项目(即 *.gpr 文件)只能由单个用户打开。 因此,如果您尝试同时两次打开同一项目,系统通过 hello world.lock 和 hello world.lock~ 文件实现的并发锁将阻止此操作,如以下截图所示:

 

图 1.10 – Ghidra 项目已锁定

下一节我们将介绍如何向 项目中添加二进制文件。

将文件导入到 Ghidra 项目

我们可以 开始向 hello world 项目添加文件。 为了用 Ghidra 分析一个极其简单的应用程序,我们将编译以下用 C 编程语言编写的 hello world 程序( hello_world.c ):

#include <stdio.h>
int main(){
    printf("Hello world.");
}

我们使用以下命令来 编译它:

C:\Users\virusito\Desktop\hello_world> gcc.exe hello_world.c

我们来分析生成的 Microsoft Windows 可移植可执行 文件: hello_world.exe .

让我们导入 hello world.exe 文件到项目中;为此,我们需要转到 文件 导入文件 。 或者 ,我们可以按下 键:

图 1.11 – 将文件导入 Ghidra 项目

Ghidra 自动识别出 hello_world.exe 程序是一个针对 32 位架构的 x86 便携式可执行二进制文件。 由于已成功识别,我们可以点击确定继续。 导入完成后,您将看到该文件的摘要:

图 1.12 – Ghidra 项目文件导入结果摘要

双击 hello_world.exe 文件或点击 工具柜 中的绿色 Ghidra 图标,文件将被 打开并加载 到 Ghidra 中:

图 1.13 – 包含可移植可执行文件的 Ghidra 项目

将文件导入项目后,您就可以开始进行逆向工程了。 这是 Ghidra 的一项很棒的功能 ,它允许您将多个文件导入到单个项目中,因为您可以对多个文件(例如可执行二进制文件及其依赖项)执行某些操作(例如搜索)。 在下一节中,我们将了解如何使用 Ghidra 分析这些文件。

配置和执行 Ghidra 分析

系统将询问是否分析该文件,建议您选择是 ,因为分析操作能识别函数、参数、字符串等重要信息。 通常应允许 Ghidra 自动完成这些分析工作。 系统提供了大量分析配置选项。 点击任一选项即可查看其说明,相关描述会显示在右上角的描述区域:

图1.14 - 文件分析选项

点击 分析 进行 文件 分析。 随后您将看到 Ghidra 的 CodeBrowser 窗口。 如果遗漏分析内容也无需担心,您可稍后重新分析程序(前往 分析 选项卡,选择 自动 分析‘hello_world.exe’… )。

探索 Ghidra CodeBrowser

Ghidra CodeBrowser 默认采用了精心设计的 停靠窗口布局,如 下 图所示:

 

图 1.15 – Ghidra 的 CodeBrowser 窗口

让我们来看看 CodeBrowser 的默认 分布方式:

  1. 与常见的逆向工程框架一样,Ghidra 默认在屏幕中央显示 文件的反汇编视图。
  2. 由于反汇编层面有时视角过于底层,Ghidra 集成了自己的反编译器,位于反汇编窗口右侧。 程序的主函数通过 Ghidra 特征码识别,随后自动生成了参数。 Ghidra 还允许你在多个维度操作反编译代码。 当然,文件的十六进制视图也在对应标签页中提供。 这三个窗口(反汇编、反编译器和十六进制窗口)保持同步,为 同一内容提供不同视角。
  3. Ghidra 还允许您轻松浏览程序。 例如,要跳转到其他程序段,您可以参考位于 程序树窗口,该窗口位于 CodeBrowser 的左上角。
  4. 如果您希望导航至某个符号(例如程序函数),请直接向下查看,找到符号树窗格所在位置。
  5. 如需处理数据类型,请再次向下滚动至 数据 类型管理器 .
  6. 由于 Ghidra 支持通过脚本执行逆向工程任务,脚本运行结果会显示在底部对应的窗口中。 当然, 书签 标签页也位于相同位置,允许您为任何内存地址创建记录完善且组织有序的书签,以便 快速访问。
  7. Ghidra 还在 顶部 设有快速访问栏。
  8. 在右下角,第一个字段显示的是 当前地址。
  9. 当前地址之后会显示 当前函数。
  10. 除了当前地址和当前函数外,当前反汇编行也会显示以完善 上下文信息。
  11. 最后,主工具栏位于 CodeBrowser 的最顶部。

既然您已了解 Ghidra 的默认界面,现在正是学习如何自定义它的好时机。 我们将在 下一节中 讨论这个问题。

自定义 Ghidra

这是 Ghidra 的默认视图,但您也可以对其进行修改。 例如,您可以通过点击 Window 菜单 并选择 您需要的窗口:

 

图 1.16 – Ghidra 窗口子菜单中的部分项目

Ghidra 拥有众多强大的功能。 例如,位于 反汇编窗口右上角的工具栏允许您通过移动字段、添加新字段、扩展反汇编列表中的字段大小 等方式来自定义反汇编视图:

 

图1.17 - 反汇编列表配置

它还允许您启用 Ghidra 一个非常有趣的功能,即其中间表示或中间语言,称为 PCode。 它使您能够开发与汇编语言无关的工具,并以更舒适的语言开发自动化分析工具

 

图 1.18 – 在反汇编列表中启用 PCode 字段

如果 启用了该功能, PCode 将会显示在列表中。 您很快就会发现, PCode 的可读性较差,但对于 脚本 逆向工程 任务而言有时更为适用:

 

图 1.19 – 启用 PCode 的反汇编列表

探索更多 Ghidra 功能

其他逆向工程框架中一些强大的功能同样被整合到了 Ghidra 中。例如,与其他逆向工程框架类似,您同样拥有图形视图:

 

图 1.20 - 一个"hello world"程序主函数的图形视图

您会注意到,Ghidra 拥有大量功能和窗口;本章我们不会全部涉及,也不会全部修改或扩展它们。 实际上,我们尚未提及 所有这些功能。 相反,我们将通过 后续章节的实 践来学习它们。

总结

本章我们探讨了 Ghidra 激动人心且别具一格的起源。 接着介绍了如何下载、安装以及从源代码自行编译。 您还学习了如何解决问题以及如何向 Ghidra 开源 项目报告新问题。

最后,您了解了 Ghidra 的结构及其主要功能(其中部分功能尚未涉及)。 现在,您可以自行 对 Ghidra 进行一些探索和实验。

本章帮助您全面了解 Ghidra 的整体概况,这些知识在后续更专注于具体细节的章节中将会非常有用。

下一章中,我们将介绍如何通过使用、修改 和创建 Ghidra 脚本 来自动化逆向工程任务 .

问题

  1. 是否存在一个绝对优于其他所有框架的逆向工程框架? Ghidra 在哪些问题上比大多数框架解决得更好? 列举一些优势 和不足。
  2. 如何配置反汇编视图以 启用 PCode?
  3. 反汇编视图与 反编译器视图有何区别?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akluse

失业老程序员求打赏,求买包子钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值