玩转Ghidra主要数据显示窗口,第五篇

2020-12-02 3,734

在进行逆向分析的过程中,除了前面介绍的六个Ghidra窗口外,还有许多其他窗口可用,在本文中,我们将为读者详细加以介绍。对于当前可用窗口的完整列表,我们可以通过Window菜单进行显示。当然,这些窗口到底能够发挥多么大的威力,不仅取决于您正在分析的二进制文件的特性,还取决于您对Ghidra窗口的熟练程度。其中,有些窗口的专业性很强,需要在后面的文章中进行更详细的介绍,所以,我们在本文中只介绍一些比较通用的窗口。

Bytes窗口

Bytes窗口能够为我们提供文件的字节级别内容。在默认情况下,Bytes窗口位于CodeBrowser窗口的右上角,显示的是程序内容的标准十六进制转储内容,其中,每行显示16个字节的内容。该窗口可以作为一个十六进制编辑器,并可以通过使用Bytes窗口工具栏中的设置工具来配置显示的各种格式。在许多情况下,将ASCII显示添加到Bytes窗口中可能会有所帮助,具体如图1所示。此外,该图中还显示了用于编辑或截图的Byte Viewer Options对话框和工具栏图标。

 

image.png 

1 同步的十六进制和反汇编视图

 

Listing窗口一样,我们也可以使用Bytes窗口工具栏中的Snapshot图标(见图1)同时打开多个Bytes窗口。在默认情况下,第一个Bytes窗口与Listing窗口会保持同步,因此,在一个窗口中滚动并点击一个元素时,会导致另一个窗口滚动到同一位置(同一虚拟地址)。而其他的Bytes窗口则没有同步功能,这样您就可以独立地滚动它们的内容。当一个窗口被断开时,该窗口的名称会出现在窗口标题栏的方括号内。

 

要将Bytes窗口变成十六进制(或ASCII)编辑器,只需切换图1中高亮显示的铅笔图标,当光标会变成红色,就表示可以进行编辑操作了。不过,我们不能对包含现有代码项(如指令)的地址进行编辑。当你完成编辑后,再次切换图标,将回到只读模式。请注意,任何更改都不会反映在断开的Bytes窗口中。

 

如果十六进制栏显示的是问号而不是十六进制值,那么就表明Ghidra无法确定给定的虚拟地址范围存放的是哪些值。当一个程序包含bss段时就会出现这种情况,虽然该段通常不占用文件内的空间,但加载器会对其进行扩展以满足程序的静态存储需求。 

Defined Data窗口

Defined Data窗口用于显示当前程序、视图或所选代码中定义的数据的字符串表示形式,以及相关的地址、类型和大小,具体如图2所示。与大多数列式窗口一样,我们可以通过单击列头,使其按升序或降序进行排序。此外,双击Defined Data窗口中的任何一行,都会使Listing窗口跳转到所选项目的地址处。

 

当与交叉引用一起使用时,Defined Data窗口可用于快速查找相关内容,并且只需点击几下就可以追踪到程序中引用该内容的所有位置。

 

image.png 

2 Defined Data窗口

 

Defined Data窗口提供了丰富的过滤功能。除了窗口底部的Filter栏外,我们也可以通过右上方的Filter图标控制额外的数据类型过滤器选项,具体如图3所示。

 

image.png 

2 类型过滤选项

 

每次点击OK按钮关闭Set Data Type Filter对话框时,Ghidra都会根据新的设置重新生成Defined Data窗口的显示内容。 

Defined Strings窗口

Defined Strings窗口用于显示在二进制文件中已定义的字符串,具体如图4所示。除了图中显示的默认列之外,您还可以通过右键单击列标题行来添加更多的列。对于我们来说,最常用的列是Has Encoding Error标志,它可以指示字符集方面的问题或字符串的识别问题。

image.png 

4 Defined Strings窗口

Symbol Table窗口与Symbol References窗口

Symbol Table窗口提供了二进制文件中所有全局名称的汇总列表,具体如图5所示,默认情况下,该窗口将显示八列内容。实际上,这个窗口具有高度可配置性,因此,我们可以根据自己的需要在其中添加和删除列,此外,我们还可以对这些列进行升序或降序排序。在默认情况下,前两个列是Name和Location列,分别用于显示名称和位置。就这里来说,所谓的名称,不过是给定义在某个位置的符号的一个符号描述而已。

 

虽然Symbol Table窗口与Listing窗口是联动的,但是,我们也可以使其相互独立。实际上,图5中右侧高亮显示的图标就是一个切换器,它决定了在Symbol Table窗口中单击某个位置是否会导致Listing窗口中的同步移动。当我们双击符号表位置条目时,Listing视图就会立即显示所选条目。这为快速导航到程序列表中的已知位置提供了一个非常便捷的方法。

 

image.png 

5 Symbol Table窗口

 

Symbol Table窗口不仅为我们提供了丰富的过滤功能,同时,还提供了多种方法来访问过滤选项。例如,工具栏中的齿轮图标可打开Symbol Table Filter对话框,具体如图6所示。除了该对话框外,我们还可以使用窗口底部的Filter选项。关于符号表过滤选项的详细介绍,请参考Ghidra的帮助菜单。

 

通过单击图5左上角附近的Display Symbol References(显示符号引用)图标,就会把Symbol References窗口添加到Symbol Table窗口中。默认情况下,它们会并排显示,具体如图7所示。这两个表之间的同步功能是单向的,当在Symbol Table中进行选择时,Symbol References列表会进行相应的更新。 

 

image.png 

6 Symbol Table Filter对话框

 

image.png 

7 并排显示的Symbol References和Symbol Table窗口

 

Symbol Table窗口一样,Symbol References窗口也具有相同的组织方式。此外,Symbol References窗口的内容由符号引用工具栏右上方的三个图标(S、I 和D)控制。这些选项是相互排斥的,即每次只能选择其中的一个图标。

 

S图标:当选择该图标时,Symbol References窗口将显示您在符号表中选择的符号的所有引用。图7显示了选择此选项后的Symbol References窗口。 

 

I图标:当选择此图标时,Symbol References窗口将显示您在符号表中选择的函数的所有指令引用。如果您没有选择函数入口点,则该列表将为空。

 

D图标:当选择该图标时,Symbol References窗口将显示您在符号表中选择的函数的所有数据引用。如果您没有选择函数入口点,或函数没有引用任何数据符号,则该列表将为空。

Memory Map窗口

Memory Map(内存映射)窗口显示了程序中内存块的摘要列表,具体如图8所示。请注意,Ghidra所说的内存块在讨论二进制文件的结构时经常被称为段(section)。窗口中呈现的信息包括内存块(段)名称、起始地址和结束地址、长度、权限标志、块类型、初始化标志,以及源文件名和用户注释的空间。起始和结束地址代表了程序段在运行时将被映射到的虚拟地址范围。

 

image.png 

8  Memory Map窗口

 

双击窗口中的任何起始或结束地址,Listing窗口(以及所有其他联动的窗口)都会跳转到指定地址。此外,Memory Map窗口工具栏还提供了添加/删除块、移动块、分割/合并块、编辑地址和设置新的映像库等选项。这些功能在对非标准格式的文件进行逆向分析时特别有用,因为Ghidra加载器可能无法正确识别二进制的段结构。

 

Memory Map窗口对应的命令行包括objdump (-h)、readelf (-S)和dumpbin (/HEADERS)。

Function Call Graph窗口

在任何程序中,一个函数既可以调用其他函数,也可以被其他函数所调用。Function Call Graph窗口用于显示一个给定函数直接相邻的其他函数。同时,如果Y直接调用X,或者X直接调用Y,我们就称Y为X的邻居。当打开Function Call Graph窗口时,Ghidra会确定光标所在函数的邻居函数,并生成相关的图形。换句话说,这个窗口用于显示一个函数在程序文件中的上下文,但这只是全局的一部分而已。

 

9显示的是一个名为FUN_140001840的函数,该函数由140001880调用,进而对另一个函数进行调用。双击窗口中的任何一个函数,都会立即令Listing窗口和其他联动的窗口立即跳转到所选函数。需要说明的是,Ghidra中的交叉引用(XREF)是生成Function Call Graph窗口的基础机制。

 

image.png 

9 Function Call Graph窗口

Function Call Trees窗口

虽然Function Call Graph窗口非常有用,但有时您需要了解全貌(或者至少是更大的画面)。为此,我们可以借助于Function Call Trees窗口(要打开该窗口,请单击Window菜单下面的Function Call Trees选项)来考察指定函数的调用方,以及被调用方。Function Call Trees窗口(如图10所示)包含两种调用:一种是对其他函数的调用,一种是其他函数对它的调用。我们可以根据需要,展开和折叠这些调用。

 

image.png 

10 Function Call Trees窗口

 

如果打开Function Call Trees窗口并选择了入口函数,就可以查看程序的函数调用的层次关系了。

小结

乍一看,Ghidra提供的窗口简直数不胜数,多到让人目不暇接。所以,刚接触该软件的时候,最简单的方法就是使用默认的显示窗口,当您熟悉这些窗口后,就可以继续探索其他显示窗口了。此外,虽然Ghidra提供了丰富的窗口,但是这并不是说每个窗口在每个逆向工程场景中都是有用的,所以,心理上不要有过大的负担——上不上菜是他们的事,吃不吃是我们的事。 

 

Ghidra是一个非常复杂的工具。除了前面所介绍的各个窗口之外,您在使用Ghidra时,还会遇到其他对话框。在后面的文章中,我们会对其中常用的对话框进行详细介绍。 

 

本文作者:mssp299

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/148324.html

Tags:
评论  (0)
快来写下你的想法吧!

mssp299

文章数:42 积分: 577

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号