物联网安全 – 20扩展 Ghidra:设置开发环境
2023-11-8 08:16:39 Author: 安全狗的自我修养(查看原文) 阅读量:17 收藏

本文是讨论和回顾如何扩展和增强 Ghidra 以进行固件分析的。

物联网安全3.物联网10大安全漏洞

物联网安全-4.低功耗蓝牙BLE

物联网安全-5.ZigBee协议物联网安全-6.ZigBee安全物联网安全-7.物联网固件逆向

物联网安全-13 硬件分析简

Ghidra是NSA开发的软件逆向工程工具。如果您熟悉 IDA-Pro、r2 或 Binary Ninja,您可能已经熟悉 Ghidra。虽然可以使用上述任何一种进行逆向工程,但 Ghidra 在 SRE 社区中迅速获得关注,因为它是开源的,并且有一个有据可查的 API,用于编写和分析二进制文件。Ghidra 也在社区的贡献下成长;对我来说,最值得注意的是将英飞凌Tricore架构添加到支持的CPU列表中。

在整个逆向工程工作中,您可能会发现自己希望在处理嵌入式系统和定制固件映像格式时通过编写额外的插件或脚本来增强或扩展 Ghidra。您可能还希望调试一些适用的预先存在的脚本或其他人开发的脚本。通过设置适当的开发环境,您可以轻松地导出处理器模块和脚本,使其他人更容易访问它们。

注意:如果您不熟悉逆向工程/Ghidra,您可能会发现本课程很有帮助!

目标

在这篇文章中,我希望解释如何在 Ubuntu 20.04 上为最新的 Ghidra 版本设置开发环境。按照下面概述的步骤操作后,我们将能够编写、调试和导出自定义 Ghidra 插件、模块和脚本。

先决条件

如果您想继续阅读这篇文章,请准备以下内容:

  • Ubuntu 20.04 虚拟机

  • Eclipse

    • Download page

  • Docker

    • Follow install instructions here

  • Java

    • sudo apt install openjdk-11-jre openjdk-11-dbg

我们将基于最新版本的 Ghidra 本教程;在撰写本文时,这是 10.2,这是最新的提交。为了构建 Ghidra,我们将使用 dukebarman 的 ghidra-builder。这个 docker 容器将帮助我们构建 Ghidra。按照以下步骤构建最新版本的 Ghidra。

  • 按照以下说明在主机上安装 docker

  • 克隆 ghidra-builder 存储库,并按照如下所示的构建说明进行操作:

git clone [email protected]:dukebarman/ghidra-builder.git
cd ghidra-builder
cd workdir
sudo ../docker-tpl/run ./build_ghidra.sh

运行这些命令时,可能会看到以下错误:

FAILURE: Build failed with an exception.

* Where:
Build file '/files/ghidra/build.gradle' line: 29

* What went wrong:
A problem occurred evaluating root project 'ghidra.'
> Requires at least Gradle 6.4, but was run with 6.0

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 43s

  • 更新 Dockerfile

要解决这些问题,我们需要更新 docker 容器使用的 Gradle 版本以及用于引用 Gradle 的环境变量。在 中找到以下行并对其进行修改,如下所示Dockerfile

dev@ubuntu:~/tools/ghidra/ghidra-builder$ git diff docker-tpl/Dockerfile
diff --git a/docker-tpl/Dockerfile b/docker-tpl/Dockerfile
index 6391c29..9ccf7fa 100644
--- a/docker-tpl/Dockerfile
+++ b/docker-tpl/Dockerfile
-RUN wget https://services.gradle.org/distributions/gradle-6.0-bin.zip -P /tmp
+RUN wget https://services.gradle.org/distributions/gradle-7.3-bin.zip -P /tmp
-ENV GRADLE_HOME=/home/dockerbot/gradle/gradle-6.0
+ENV GRADLE_HOME=/home/dockerbot/gradle/gradle-7.3
  • 更新以构建 GhidraDev 项目build_ghidra.sh

在我们尝试再次构建 Ghidra 之前,我们需要进行一些其他修改。除了构建 Ghidra 之外,我们还想生成 Ghidra Eclipse 插件。将此插件与 Eclipse 集成后,我们可以 Eclipse 启动 Ghidra,从而能够调试插件和脚本。

我们可以在构建 Ghidra 时生成 Eclipse 插件,方法是在脚本中添加以下行:workdir/build_ghidra.shgradle buildGhidra

Gradle prepDev
Gradle eclipse -PeclipsePDE
  • 运行 Docker 容器,构建 Ghidra 和 GhidraDev Eclipse 项目

rm ghidra.bin
cd ../
sudo workdir-tpl/build
cd workdir
sudo ../docker-tpl/run ./build_ghidra.sh

通过这些修改,ghidra 将在 docker 容器中正确构建,结果可以在目录下找到,如下所示:out

dev@ubuntu:~/tools/ghidra/blog/ghidra-builder/workdir$ ls out/
ghidra_10.2_DEV_20211221_linux_x86_64.zip

在继续使用 GhidraDev 扩展配置 Eclipse 之前,我们将新构建的 Ghidra 解压缩到 workdir 目录:

dev@ubuntu:~/tools/ghidra/blog/ghidra-builder/workdir/out$ unzip -q ghidra_10.2_DEV_20211221_linux_x86_64.zip -d ../
dev@ubuntu:~/tools/ghidra/blog/ghidra-builder/workdir/out$ ls ../
build_ghidra.sh ghidra ghidra_10.2_DEV out set_exec_flag.sh

此时,我们已生成以下内容:

  • Ghidra  10.2

  • Ghidra 的 eclipse 项目/插件(位于文件夹中)ghidra/GhidraBuild/EclipsePlugins

如果你正在跟进,你的目录应如下所示:workdir

dev@ubuntu:~/tools/ghidra/blog/ghidra-builder/workdir$ ls
build_ghidra.sh ghidra ghidra_10.2_DEV out set_exec_flag.sh
dev@ubuntu:~/tools/ghidra/blog/ghidra-builder/workdir$ ls ghidra/GhidraBuild/EclipsePlugins/
GhidraDev GhidraSleighEditor

接下来,我们需要构建这些 Eclipse 插件,然后安装它们。

首先,我们需要安装 Eclipse;您可以在此处获取最新版本

在上一节中,我们为 GhidraDev Eclipse 插件生成了项目。接下来,我们需要将项目导入 Eclipse 并构建它。但是,在此之前,我们需要安装以下 Eclipse 插件:GhidraDev

  • Eclipse CDT(C/C++ 开发工具)10.4 (2021-09)

  • 适用于 Eclipse 9.2.0 的 PyDev Python IDE

  • Eclipse插件开发环境

要安装插件,请打开 Eclipse 并导航到 > ,将出现以下窗口:HelpEclipse Marketplace

首先,通过在搜索栏中输入并安装下图中显示的内容来安装 Eclipse 插件开发环境:Plugin development

接下来,我们需要安装 C/C++ 开发插件。在搜索栏中输入 CDT,然后安装如下所示的插件:

接下来,我们需要安装 PyDeV 插件:

安装这三个插件后,已安装的插件窗口应与如下所示匹配:

现在,我们可以将 GhidraDev 插件导入 Eclipse 中,并安装这些插件。导入插件后,我们将导出它并将其安装在 Eclipse 中,从而允许我们从 Eclipse 启动 Ghidra 并调试我们的各种插件和脚本。

首先,我们将 GhidraDev 项目导入到 Eclipse 中;这将在您的文件夹中。要导入项目,请导航到以下菜单:ghidra/GhidraBuild/EclipsePlugins

File > Import > General > Existing Projects into Workspace

导入项目后,Eclipse 窗口应如下所示,并显示 和 projects:EclipseGhidraDevFeatureEclipseGhidraDevPlugin

现在项目已经导入并构建,我们需要导出它。为此,请导航到以下菜单:

File > Export > Plug-in Development > Deployable Features

在此窗口中,选择复选框中的要素,并指定要导出的存档的位置;在下面显示的窗口中,我将其设置为 .请注意这个位置,因为在下一节中,我们将把这个存档导入到 Eclipse 中!ghidra.ghiradev/home/dev/ghidraDev.zip

现在插件已经导出,我们可以在 Eclipse 中安装它。为此,请打开以下窗口:

Help > Install New Software

单击该按钮,这将出现以下窗口:Add

接下来,我们将通过单击按钮加载先前生成的存档。然后,导航到您在前面步骤中导出文件的位置并选择它。ArchiveghidraDev.zip

点击下一步安装插件;安装完成后,系统将提示您重新启动 Eclipse,执行此操作,重新启动后,您将在顶部菜单中看到菜单选项。GhidraDev

现在我们已经安装了插件,我们可以生成我们的第一个 Ghidra 脚本项目;为此,请导航到以下菜单:

GhidraDev > New > Ghidra Script Project

为您的项目选择一个名称;在此示例中,我将使用 GhidraScriptsVSS。

单击“下一步”继续项目配置,然后在以下窗口中单击“下一步”:

接下来,我们需要链接我们当前的 Ghidra 安装;如果您按照前面的步骤在 docker 容器中构建了 Ghidra,这将是我们之前提取的目录。ghidra_10.2_DEV

接下来,您可以使用与上一节中指出的 Ghidra 安装捆绑在一起的 Jython 解释器来启用 Python 支持。

Ghidra 项目将显示在您的 Eclipse 项目中,我们可以添加第一个脚本!

在我博客上的一篇文章中,我编写了一个 Ghidra 脚本来分析 ARM 拇指模式二进制文件(Game Boy Advance ROM 是出色的测试目标!),重点是寻找功能序章。让我们加载下载该脚本并针对新的二进制文件运行它。

  • Ghidra 实用程序存储库

要将新的 Java 文件添加到我们的项目中,请下载 MakeFunctionsScriptGBA.java 文件并将其复制到项目位置。就我而言,这是在目录中。如果没有该目录,则可以通过右键单击项目目录中的文件夹并单击来确定位置,从而显示以下窗口:~/ghidra_scriptsHome ScriptsProperties

下载 ghidra-utils 存储库并将函数发现脚本复制到我们的项目目录中后,我们现在可以在 Eclipse 工作区中看到该脚本。

让我们把这个脚本放在另一个游戏的另一个ROM映像上运行它;这一次,我们将使用 Monster Rancher Advance 作为测试用例。

我们可以在 Ghidra 中启动此脚本,方法是右键单击项目资源管理器中的脚本,然后单击

Run As > Ghidra

这将导致先前链接的 Ghidra 安装启动。启动后,我们将选择目标二进制文件,然后单击>打开窗口,显示以下内容:Script ManagerWindowScript Manager

我们可以通过在搜索栏中输入脚本来找到它;我们可以双击它以在新的未分析的ROM上启动它。以下是我运行脚本的参数;我们将在整个 ROM 上运行它并表示结果。

输入第三个选项后,脚本将运行并在 ROM 映像中查找函数。在此示例中,该脚本能够识别 240 个函数。

如果我们想在运行时修改或调试这个脚本,我们现在可以在 Eclipse 中轻松完成。

假设我们想在用户输入他们希望分析的内存区域数量后中断。为此,我们可以转到脚本中的相关行,并通过双击行号来设置断点。我们还需要使用项目管理器中的选项重新启动 Ghidra。Debug As

当我们在调试模式下启动 Ghidra 时,Eclipse 将如下所示:

现在,如果我们从 Ghidra 重新运行脚本,将发生以下情况:

我们可以看到我们的断点命中,允许我们单步执行脚本。此外,调试器集成有助于调试我们的脚本并逐步执行其他脚本,以帮助我们了解它们的工作原理。

使用 GhidraDev 插件,我们可以设置断点、记录更多信息并在 Ghidra 中运行我们的脚本。

在这篇文章中,我们回顾了如何:

  • 使用 docker 构建最新版本的 Ghidra

  • 设置用于扩展 Ghidra 的 Eclipse 开发环境

  • 构建并安装 GhidraDev 插件

  • 将 Ghidra 脚本加载到现有项目中,并使用 Eclipse 对其进行调试

有了这个,我们现在拥有了扩展和增强 Ghidra 所需的所有工具。

  • Ghidra builder 的补丁

dev@ubuntu:~/tools/ghidra/ghidra-builder$ git diff docker-tpl/Dockerfile
diff --git a/docker-tpl/Dockerfile b/docker-tpl/Dockerfile
index 6391c29..9ccf7fa 100644
--- a/docker-tpl/Dockerfile
+++ b/docker-tpl/Dockerfile
@@ -33,10 +33,10 @@ USER dockerbot
# Build tools are part of the builder image; project code is mounted
RUN mkdir -p $HOME/.gradle/init.d/

-RUN wget https://services.gradle.org/distributions/gradle-6.0-bin.zip -P /tmp
+RUN wget https://services.gradle.org/distributions/gradle-7.3-bin.zip -P /tmp
RUN unzip -d $HOME/gradle /tmp/gradle-*.zip

-ENV GRADLE_HOME=/home/dockerbot/gradle/gradle-6.0
+ENV GRADLE_HOME=/home/dockerbot/gradle/gradle-7.3
ENV PATH=$GRADLE_HOME/bin:$PATH

RUN echo "\
dev@ubuntu:~/tools/ghidra/ghidra-builder
$ git diff workdir/build_ghidra.sh
diff --git a/workdir/build_ghidra.sh b/workdir/build_ghidra.sh
index 50d350d..dbe9494 100755
--- a/workdir/build_ghidra.sh
+++ b/workdir/build_ghidra.sh
@@ -17,7 +17,8 @@ cd
$START_DIR/ghidra
gradle --init-script gradle/support/fetchDependencies.gradle init
gradle yajswDevUnpack
gradle buildGhidra
-
+gradle prepDev
+gradle eclipse -PeclipsePDE

其它课程

windows网络安全一防火墙

windows文件过滤(更新完成)

USB过滤(更新完成)

游戏安全(更新中)

二进制漏洞(更新中)

ios逆向

还有很多免费教程(限学员)

更多详细内容添加作者微信


文章来源: http://mp.weixin.qq.com/s?__biz=MzkwOTE5MDY5NA==&mid=2247489574&idx=1&sn=5409dd42dbe867d942c196fff17ad907&chksm=c13f2b6ff648a2797ddc1020bac3ba84b8679a1642fcafc621436287c3bde61e9cc3ef41a9c7&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh