开源逆向软件Ghidra初体验

前言

NSA开源的逆向工具Ghidra,使用Java开发,可作为IDA的替补。下面以bugku逆向模块第一题为例,使用Ghidra分析可执行文件。

使用过程

首先新建项目,并导入这道题的文件baby.exe。
在这里插入图片描述

下图是导入的文件的摘要:
在这里插入图片描述
导入后,要分析的文件已在项目中显示,如下图所示。双击baby.exe,Ghidra将对其分析,然后进入代码浏览器。
在这里插入图片描述

分析前弹出一个方框,勾选分析选项:
在这里插入图片描述

在此先将这些选项的含义记录一下,其中有一些的含义尚不明:
1.激进式代码搜寻:从未定义的字节里解析出汇编代码。因为可能会解析出无意义代码,所以应慎用。
2.应用数据档案:根据程序信息应用已知数据类型档案。(?)
3.ASCII字符:搜寻出文件中合法的ASCII字符串并标出来。
4.调用约定标记:使用反编译器找出未知的调用约定。(?)
5.Call-Fixup:针对那些调用了无返回函数的函数的一个修补功能。
6.压缩填充字节:把函数间的填充字节折叠起来。
7.创建地址表:
8.数据引用:分析数据之间的相互引用。
9.反编译器的参数ID(?):使用反编译器为一个函数创建参数和局部变量。会比较耗时。分析大程序默认关闭此功能。
10.反编译器switch分析:使用反编译器为动态指令创建switch语句。
11.Demangler:尝试还原源程序中的变量的原名称及数据类型。(引用网友的说法:识别C++编译以后的函数名的过程,就叫demangle)
12.反汇编入口点:在新增内存中反汇编出入口点(?)。
13.嵌入的媒体数据:找到嵌入的媒体数据,并尝试分析其类型(如png,gif,jpeg,wav)。
14.外部入口引用:为外部入口点建立函数的定义信息。
15.函数的ID:通过哈希方法找到已知的函数。
16.函数起始点搜索:找函数的起始点。
17.代码后函数起始点搜索(?)
18.数据后函数起始点搜索(?)
19.无返回函数:在反汇编后,根据某些特征找到无返回函数。这里有个可以设置的阈值,当可判定为“无返回函数”的特征数超过设置的阈值时,即将函数标记为“无返回”。
20.无返回函数(对于已知函数):(根据已知的无返回函数的名字)通过名称来定位无返回函数,并设置“无返回”标志。
21.PDB(程序的数据库文件):自动载入PDB文件(如果有)。
22.引用:解析指令引用的数据。
23.标量操作数的引用:分析标量操作数,找到其引用地址(?)
24.共享的有返回的调用:当一个代码分支的跳转目的是另一个函数时,将其转成一个调用,接着立即返回(?)。
25.栈:为函数创建栈上变量。
26.子路径引用:为被调用的代码创建函数定义信息。
27.Windows x86 PE异常处理:在windows PE程序中,将异常处理的数据结构标记出来。
28.Windows x86 PE RTTI分析:找到并创建所有RTTI元数据以及相关的vf(visual foxpro,foxbase数据库开发软件)表。
29.Windows PE x86:这个解析器使用外部Windows函数调用参数信息来为参数添加注释。
30.WindowsResourceReference:创建对windows资源的引用。
31.X86常量引用解析器:常量引用。
32.X86中的被调用函数中的清除过程:大致意思可能是把(stdcall类型的)被调函数清除的栈上参数记录起来。

解析完成后,弹出一个方框,提示没有调试信息,没有数据结构类型信息:
在这里插入图片描述

接着便进入代码浏览器的默认界面:
在这里插入图片描述

还有其他有用的窗口没有在默认界面上,点击上方工具栏中windows即可查看这些窗口:
在这里插入图片描述
在本示例中,程序打印了一串字符。打开“预定义数据”窗口,搜索到这个字符串的定义位置,然后在反汇编面板中这个字符串的位置处点击右键,选择references -> show references to addresses,在弹出的表格中可查看引用了该数据的指令,单击跳到对应位置,找到printf调用处,并在其后找到flag。
在这里插入图片描述
在这里插入图片描述
Ghidra还提供了使用文档。鼠标点击了某个面板后,按f1可调出相关功能的说明文档:
在这里插入图片描述

与IDA对比,Ghidra显得简陋得多(有点Eclipse和IDEA相比的感觉)。目前感觉可能的亮点会在它的脚本管理器的200多个自带脚本中。这些脚本使用Java或Python编写,用Java写的都是继承ghidra.app.script.GhidraScript类,然后实现run方法,而用Python时调用模块的方法就行了,编写起来方便得多,还可以用Ghidra自带的Python交互界面单句执行,方便调试。找个时间再整理下这些脚本的功能。
在这里插入图片描述
还有一个相比IDA的优点,就是Ghidra具有撤销操作。比如,我用IDA的时候,在反编译的伪代码里修改数据类型,有时改错了,撤销不了,手动改回来又会报错can not change the variable type。而Ghidra可以ctrl+z,可以反悔的呀。
在这里插入图片描述
在这里插入图片描述

记录一些重要功能(不定时更新)

按键G:跳转到某地址

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值