CTF-All-In-One/doc/2.2.6_Ghidra.md
firmianay f630f51de5 fix
2019-03-26 20:21:52 +08:00

154 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2.2.6 Ghidra
Ghidra是RSA Conference 2019上NSA发布的一个开源的逆向分析工具。由于该分析工具使用Java开发因此可以在Windows、macOS和Linux系统上都可以运行且有不错的使用体验。此外由于Ghidra内置了Jython解释器我们还可以使用Java或Python开发自己的Ghidra插件或者脚本。至此对于无法忍受IDA Pro高昂售价的二进制安全研究者和CTFer来说不仅有了免费的开源工具甚至Ghidra在一些反编译的特性上比IDA Pro还要优秀对于其他的开源反编译工具如Binary Ninja和r2也将借鉴Ghidra中的反汇编实现为这些工具的质量更上一层楼。
## 1.Ghidra安装和初始化
Ghidra的官方地址[https://ghidra-sre.org/](https://ghidra-sre.org/),我们可以在官网上找到工具的下载链接和帮助文档。
想要安装使用Ghidra仅支持以下系统64位的Windows 7或Windows10、64位的Linux发行版最好是CentOS 7或是macOS 10.8.3以上的版本硬件的要求是4GB的内存和1GB的硬盘空间此外官网还提到建议使用双屏的显示器来操作Ghidra。Ghidra是使用Java开发的因此软件要求是需要系统中有安装Java 11 Runtime and Development Kit (JDK 11)。
Ghidra没有提供安装程序只有一个压缩包下载官网的描述是这样可以不修改系统的配置也便于删除该工具。我们以Windows系统为例来安装和使用Ghidra如果想解压Ghidra到系统盘符则需要管理员权限。
在运行Ghidra之前我们需要先配置Java的环境变量。对于Windows系统来说前往Oracle官网https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html下载Windows系统的安装程序后选择目录安装JDK之后就是设置环境变量了。此时我们需要
- 新建一个名为JAVA\_HOME的环境变量值为JDK的安装目录如C:\\Program
Files\\Java\\jdk-11.0.2
- 新建一个classpath的环境变量值为
%JAVA\_HOME%\\lib;%JAVA\_HOME%\\lib\\tools.jar
- 最后在Path环境变量中添加 %JAVA\_HOME%\\bin的值就完成了
此时Java环境变量就设置完成了开启一个cmd窗口并输入java
-version出现如下字样就代表Java环境变量设置成功此时就可以打开Ghidra了
![Java环境变量](../pic/ghidra_1.png)
点击解压安装包后的Ghidra目录中的ghidraRun.bat就可以开启Ghidra了
![Ghidra启动](../pic/ghidra_2.png)
那么接下来让我们学习Ghidra的使用。
## 2.Ghidra简单使用
Ghidra支持的处理器架构可以在Help菜单的Install
Processers选项查看目前来看还是可以分析主流的架构的
![Ghidra支持的处理器架构](../pic/ghidra_3.png)
Ghidra有GUI模式、CLI模式、Ghidra Server模式和独立Jar包运行模式上节我们是通过GUI模式打开运行的。Ghidra支持多人协作完成一个逆向项目多人可以使用多个设备对二进制可执行文件进行分析并将其修改提交到公共的server端存储库中相关配置和文档在Ghidra 安装目录下的server目录中有详尽的说明。Ghidra的Jar包模式指的是可以将Ghidra打包成一个Jar包来运行在Windows系统中只需要运行support目录下的buildGhidraJar.bat脚本即可打包成Jar包。
Ghidra的目录如下所示
![Ghidra目录](../pic/ghidra_4.png)
其中docs目录是相关的离线文档Extensions是Ghidra的插件目录Ghidra目录是其主要程序目录GPL目录是独立的GPL支持程序server目录是Ghidra server的文档和执行程序support目录包含了一些在高级模式下调试和运行Ghidra的脚本。
对于Ghidra的插件安装可以在GUI模式中通过相应的菜单安装也可以直接将扩展解压到Extensions目录。如果我们想编写自己的Ghidra插件Ghidra也提供了一个名为GhidraDev的Eclipse插件在Eclipse中开发。
由于Ghidra支持多人协作因此我们在使用Ghidra分析可执行文件时首先需要创建工程。在File菜单的New
Project选项选择是否共享该工程并设置工程的名称和目录即可。此时我们在File菜单点击Import
File就可以导入想要分析的文件了
![导入可执行文件](../pic/ghidra_5.png)
载入文件后会列出该可执行文件的详细信息:
![导入可执行文件的详细信息](../pic/ghidra_6.png)
导入分析完成之后,我们可以在项目目录中找到该二进制可执行文件,双击即可进入:
![Ghidra项目目录](../pic/ghidra_7.png)
双击后会提示该文件还未被分析我们选择OK在下一步的菜单中选择合适的分析选项即可进行分析
![分析可执行文件](../pic/ghidra_8.png)
![选择合适的Ghidra分析选项](../pic/ghidra_9.png)
分析完成之后就可以看到Ghidra的窗口了中间是反汇编代码右侧是类似IDA Pro F5功能的伪代码由于我们分析的可执行文件编译时添加了-g参数保留有调试信息因此反编译结果和源码相差无几
![反编译结果](../pic/ghidra_10.png)
Ghidra的菜单栏和IDA Pro类似File菜单可以导入PDB文件或是打开新项目Edit菜单可以进行一些简单的设置Analysis菜单主要是分析选项的调整Navigation菜单有快捷的前往下一函数等功能Search菜单可以进行字符串的搜索等Tools菜单可以查看当前可执行文件的处理器帮助手册也有一个Diff功能。Window菜单可以快捷打开其他窗口如字符串等Help菜单可以查阅帮助文档和API文档等。
此外点击快捷工具栏的脚本管理按钮可以看到有很多辅助分析的Java、py脚本
![脚本管理](../pic/ghidra_11.png)
选择脚本就可以直接运行,如字符串的搜索功能:
![双击运行脚本](../pic/ghidra_12.png)
Ghidra常用的快捷键可以在docs目录下的CHeatSheet.html文件中查看。和IDA Pro一样多多使用才能将快捷操作熟练掌握。
## 3.Ghidra多人协作
Ghidra允许我们在机器上安装Ghidra服务以便多人协作分析某个文件或某些项目这恰是IDA Pro没有的功能。本节将对Ghidra的多人协作功能进行简单介绍。
Ghidra多人协作服务的相关帮助文件和脚本在Ghidra的安装目录的 server目录下在使用多人协作功能之前我们需要安装Ghidra Server的服务我们以在Windows系统下运行Ghidra的服务为例。由于在安装过程中需要获取管理员权限因此我们需要新打开一个管理员权限的cmd窗口并运行如下脚本
```shell
D:\\ghidra\_9.0\\server\> .\\svrInstall.bat
YAJSW: yajsw-stable-12.12
OS : Windows 10/10.0/amd64
JVM : Oracle Corporation/11.0.2/C:\\Program Files\\Java\\jdk-11.0.2/64
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by
org.codehaus.groovy.reflection.CachedClass
......
\*\*\*\*\*\*\*\*\*\*\*\*\* STARTING ghidraSvr
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
Service ghidraSvr started
安装服务完成之后,可以运行如下脚本检查服务状态:
D:\\ghidra\_9.0\\server\> .\\svrInstall.bat status
...
Name : ghidraSvr
Installed : true
Running : true
Interactive : false
Automatic : true
Manual : false
Disabled : false
Paused : false
Unknown : false
```
在输出窗口观察到服务正在运行就可以在Ghidra的新建项目填入相应的服务的IP与端口号即可。我们可以看到这里需要密码认证这时我们可以在新弹出的窗口看到本机的User ID在Server端的cmd窗口运行`SvrAdmin.bat -add
User\_id`即可就可以在Server端默认的连接密码是`changeme`初次使用该密码会要求更改这个默认密码否则将会在24小时后过期。如果用户遗忘密码可以在Server端的cmd窗口运行`SvrAdmin.bat -reset User\_id`就可以重置密码为changeme
![输入密码](../pic/ghidra_13.png)
输入密码成功登录后和本机的操作类似就可以进行新建一个项目了还可以针对连接到该Ghidra 服务器的用户对该项目的权限进行管理:
![Ghidra服务端项目权限管理](../pic/ghidra_14.png)
此外Ghidra的多人协作功能还有着版本追踪功能在本地导入文件后并提交更改有该项目权限的用户就可以看到该文件了在对文件修改后并提交有权限的用户也可以同步该更改
![Ghidra的版本追踪功能](../pic/ghidra_15.png)
Ghidra内建支持的协作功能比IDA Pro的插件支持更加人性化只是操作步骤还需要更合理的优化。官方文档对Ghidra的帮助文件写得十分清楚明了如果在使用中遇到疑问可以查阅相关文档或是寻求Ghidra社区的帮助。
经过一番尝试Ghidra的反编译功能的确很好用查看和定位汇编代码也十分方便但由于其是以Java编写的因此分析速度仍然不如IDA Pro快速且UI界面仍需美化才能更好的使用但是由于其开源的优势相信随着越来越多的二进制安全研究人员的参与Ghidra也会变得越来越易用。