ret-sync:用于同步WinDbg/GDB/LLDB/OllyDbg2/x64dbg 调试会话的插件
2020-06-05 10:32:05 Author: www.4hou.com(查看原文) 阅读量:521 收藏

ret-sync是一组插件,用于同步WinDbg/GDB/LLDB/OllyDbg2/x64dbg 调试会话的插件。

ret-sync

ret-sync的英文全称是 Reverse-Engineering Tools SYNChronization(反向工程工具同步)。它是一组帮助调试会话(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)与反汇编程序(IDA/Ghidra)同步的插件。其基本思想很简单:从两个不同的状态(静态和动态分析)中获取最佳结果。

调试器和动态分析为我们提供:

1. 带有动态上下文(寄存器、内存等) 的本地视图;

2. 内置专门的功能或API,例如:WinDbg的!peb, !drvobj, !address等。

反汇编和静态分析为我们提供:

1. 模块宏视图;

2. 代码分析、签名、类型等;

3. 形象的图形视图;

4.反编译;

5.在IDB / GPR中持久存储知识。

主要功能:

1. 将图形和带有调试器状态的反编译视图同步;

2. 无需处理ASLR,可实时重新定位地址;

3. 将数据(注释、命令输出)从调试器传递到反汇编器;

4. 多个IDB / GPR可以同时同步,从而可以轻松地跟踪多个模块;

5. 反汇编器和调试器可以位于不同的主机或VM上。

ret-sync是我在Quarkslab期间开发和维护的一个qb-sync分支。

存储库介绍

调试器插件:

ext_windbg / sync:WinDbg扩展源文件,生成:sync.dll

ext_gdb / sync.py:GDB插件

ext_lldb / sync.py:LLDB插件

ext_olly1:OllyDbg 1.10插件

ext_olly2:OllyDbg v2插件

ext_x64dbg:x64dbg插件

以及反汇编程序插件:

ext_ida / SyncPlugin.py

ext_ghidra / dist / ghidra _ * _ retsync.zip:Ghidra插件

运行的前提条件

IDA和GDB插件需要一个有效的Python设置来支持python2和python3。还需要argparse模块,它默认包含在2.7和更高版本的Python标准库中。

二进制发行版

针对WinDbg/OllyDbg/OllyDbg2/x64dbg调试器的预构建二进制文件是通过Azure DevOps管道提出的:

选择最后一个版本,然后在“Related”部分6 published中进行检查。

在ext_ghidra/dist中提供了Ghidra插件的预构建文档

ret-sync配置

对于大多数使用典型设置的用户而言,ret-sync应该是开箱即用的:调试器和反汇编器位于相同的主机上,模块名称匹配。

在某些情况下,仍可以使用特定配置。为此,扩展程序和插件会在用户的主目录中检查名为.sync的可选全局配置文件,它必须是有效的.INI文件。

此外,IDA和Ghidra插件还将首先在IDB或项目目录(  <   project   >   .rep)中查找配置文件,以允许按IDB /项目进行本地设置。如果存在本地配置文件,则忽略全局配置文件。

在这些配置文件中声明的值将覆盖默认值,请注意,默认情况下不创建.sync文件。

下面我们详细介绍三个配置文件有用/需要的常见场景:

1. 远程调试;

2. 模块名称不匹配;

3. 缺失的PID。

远程调试:调试器和反汇编器位于不同的主机上

[INTERFACE]部分用于自定义与网络相关设置,让我们假设有人希望将IDA与运行在虚拟机或另一个主机中的调试器进行同步,这是常见的远程内核调试场景。

简单地创建两个.sync文件:

一个在安装了IDA的计算机上的IDB目录中:

3.png

它告诉ret-sync IDA插件使用端口9234在接口192.168.128.1上进行侦听,所以,该接口必须可以从远程主机或虚拟机访问。

另一个在执行调试器的计算机上,位于用户的主目录中:

4.png

它告诉ret-sync调试器插件连接到之前配置为在此接口中监听的ret-sync IDA插件。

注意:你必须在此处指定一个真实IP,而不要使用0.0.0.0。这是因为该变量同时被多个源用于绑定和连接,因此使用0.0.0.0将导致奇怪的错误。

IDB和调试器模块名称不同

5.png

[ALIASES]部分用于自定义名称,反汇编程序(IDA / Ghidra)使用该名称将模块注册到其调度程序/程序管理器。

默认情况下,反汇编程序插件使用输入文件的名称。但是,可能已经预先重命名了该文件,并且该文件与调试器看到的实际进程或已加载模块的名称不再匹配。

我们只是简单地告诉调度程序匹配名称ntkrnlmp.exe(真实名称),而不是ntoskrnl_vuln.exe (IDB名称)。

具有Qt Creator调试前端的gdb

Qt Creator调试前端更改了gdb命令输出的记录方式,由于这会干扰同步,所以可以使用原始的gdb输出进行同步,而不是使用临时文件。在.sync配置文件中使用,过程如下:

6.png

如果你希望使用Qt调试前端作为目标,可以进行如上操作。

嵌入式设备和丢失的/proc/  <   pid   >  /maps

在某些情况下,例如通过QEMU中的串行或原始固件调试嵌入式设备,gdb无法识别PID,在这些情况下,[INIT]部分用于将自定义上下文传递给插件,它允许覆盖某些字段,例如PID和内存映射。

.sync内容提取:

7.png

映射中的条目分别是:mem_base、mem_end、mem_size、mem_name。

安装

IDA扩展

IDA先决条件

很简单,需要IDA 7.x分支。

安装IDA扩展

对于IDA安装,将Syncplugin.py和retsync文件夹从ext_ida复制到IDA plugins目录,例如:

8.png

运行IDA扩展

1. 打开IDB

2. 在IDA中运行插件(Alt-Shift-S)或Edit -   >   plugin -   >   ret-sync

9.png

IDA插件故障排除

要解决IDA扩展的问题,在文件retsync/rsconfig.py中有两个选项:

10.png

将LOG_LEVEL值设置为logging.DEBUG会使插件更详细。

将LOG_TO_FILE_ENABLE值设置为True会将broker.py和dispatch .py中的异常信息记录到专用文件中。日志文件是在名称模式为retsync.%s.err的%TMP%文件夹中生成的。

Ghidra扩展

构建Ghidra扩展

可以使用ext_ghidra/dist文件夹中的预构建版本,也可以按照说明进行构建。每个扩展版本只支持插件文件名中指定的Ghidra版本。例如,ghidra_9.1_PUBLIC_20191104_retsync.zip是针对Ghidra 9.1 Public的。

1. 安装Ghidra;

2. 安装gradle;

11.png

3. 为你的Ghidra安装构建扩展名(将$ GHIDRA_DIR替换为安装目录)。

12.png

安装Ghidra扩展

1. 在Ghidra项目管理器中:File-   >   Install Extensions ...,单击+号并选择ext_ghidra / dist / ghidra _ * _ retsync.zip,然后单击OK。这将有效地将zip中的retsync文件夹提取到$ GHIDRA_DIR / Extensions / Ghidra /;

2. 根据要求重启Ghidra;

3. 重新加载Ghidra后,在CodeBrowser中打开一个模块。它应该告诉你已检测到新的扩展插件。选择“是”进行配置。然后勾选“RetSyncPlugin”,然后单击“确定”。控制台应显示以下内容:

13.png

4.从Ghidra CodeBrowser工具中:使用工具栏图标或快捷方式来启用(Alt + s)/禁用(Alt + Shift + s)/重新启动(Alt + r)同步。

状态窗口也可以从Windows-   >   RetSyncPlugin获得,你通常希望将其与Ghidra环境窗口集成。

WinDbg扩展

构建WinDbg扩展

可以使用预先构建的二进制文件,也可以使用ext_windbg中提供的Visual Studio 2017解决方案(如果需要,请点此参阅),这将生成x64\release\sync.dll文件。

安装WinDbg扩展

你将需要将生成的sync.dll文件复制到相应的Windbg扩展路径中。

WinDbg Classic:

对于Windbg的早期版本,它如下这样(注意x86/x64):C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll。

Windbg预览

用于存储扩展名的文件夹似乎是基于PATH的,因此你需要将其放在查询位置。如下所示:

C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll

运行WinDbg扩展

1. 在目标上启动WinDbg;

2. 载荷扩展(.load命令);

14.png

3. Sync WinDbg:

15.png

在IDA的输出窗口中的示例如下:

16.png

如果Windbg当前模块与IDA文件名匹配:

17.png

WinDbg安装故障排除

如果出现以下错误,那是因为你没有按照上述步骤将文件复制到正确的文件夹。

18.png

下面的错误通常表示Windbg尝试加载错误的扩展名,例如:x86代替x64 sync.dll。

19.png

GNU gdb (GDB)安装

1. 将ext_gdb/sync.py复制到你选择的目录;

2. 加载扩展(参见自动加载脚本的过程)。

20.png

LLDB安装

LLDB支持是实验性的,但载荷扩展也可以添加到~/.lldbinit中。

21.png

OllyDbg 1.10安装

OllyDbg 1.10支持是实验性的,但是:

1. 使用VS解决方案构建插件(可选,参见预构建的二进制文件);

2. 将dll复制到OllyDbg的插件目录中;

OllyDbg2安装

OllyDbg2支持是实验性的,但是:

1.使用VS解决方案构建插件(可选,参见预构建的二进制文件);

2.将dll复制到OllyDbg2的插件目录中

x64dbg安装

基于testplugin,x64dbg支持是实验性的,但是:

1.使用VS解决方案构建插件(可选,参见预构建的二进制文件),也许你需要一个不同版本的插件sdk,副本可以在每个版本的x64dbg中找到。将“pluginsdk”目录粘贴到“ext_x64dbg\x64dbg_sync”中;

2.在x64dbg的插件目录中复制dll(扩展名为.d32或.dp64)。

用法

ret-sync调试器命令

对于面向命令行的调试器(主要是Windbg和GDB),通过ret-sync公开一组命令,以帮助执行逆向工程任务。

下面的命令是通用的(Windbg和GDB),请注意WinDbg中的前缀“!”(例如:GDB中的sync, WinDbg中的!sync)。

22.png

WinDbg具体的命令如下:

23.png

GDB命令如下:

24.png

IDA的使用

IDA插件的GUI

“覆盖IDB名称”输入字段用于更改默认IDB名称,它是插件用来向调度程序注册的名称。 IDB自动切换基于模块名称匹配。如果名称冲突(例如foo.exe和foo.dll),则可用于简化匹配。请注意,如果你在同步处于活动状态时修改输入字段,则必须重新向调度程序注册;只需使用“重新启动”按钮即可完成。

提醒一下,在默认情况下,可以使用.sync配置文件来别名化。

Ghidra的用法

Ghidra插件的GUI

一旦RetSyncPlugin打开,你可以通过简单的拖拽将它添加到CodeBrowser窗口:

25.png

如果你想查看几个模块,文件需要在同一个CodeBrowser查看器中打开,只需在CodeBrowser窗口中拖放额外的模块即可获得如上所示的结果。

WinDbg用法

WinDbg插件命令

!sync::开始同步;

!syncoff:停止同步;

!synchelp:显示可用命令的列表,并附有简短说明;

!cmt [-a address]:在IDA中的当前IP处添加注释;

26.png

!rcmt [-a address]: 在IDA中的当前IP处重置注释;

27.png

!fcmt [-a address] : 为当前IP所在的函数添加函数注释;

28.png

注意:不带参数的调用此命令将重置函数的注释。

!raddr :添加一个注释,其中包含从表达式求值的重新定位的地址;

!rln :从反汇编器获取给定地址的符号;

!lbl [-a address] :在反汇编程序中的当前ip处添加标签名称;

29.png

!cmd :在WinDbg中执行命令,并将其输出作为注释添加到反汇编程序中的当前ip处;

30.png

!bc   <   ||on|off|set 0xBBGGRR   >   :启用/禁用反汇编程序中的路径着色,这不是代码跟踪工具,但是有一些有效的工具。每个手动步进的指令在图中都带有颜色。如果不带参数调用,则在当前ip上为单个指令着色。 “set”参数用于使用新的十六进制rgb代码设置路径颜色(如果使用值   >   0xFFFFFF调用,则重置颜色)。

!idblist:获取连接到调度程序的所有IDB客户端的列表:

31.png

!syncmodauto   <   on|off   >  : 基于模块名称启用/禁用反汇编程序自动切换:

32.png

!idbn:将活动IDB设置为第n个客户端, n应该是有效的十进制值。

33.png

在本例中,当前活动的IDB客户端将被设置为:

34.png

!jmpto:在当前调试器状态的上下文中评估作为参数给出的表达式。如果注册了匹配的模块,则反汇编程序的视图将与结果地址同步。可以看作是手动同步,是即时动态执行重定位。对于随机重定位的二进制文件特别有用。

!jmpraw:在当前调试器状态的上下文中评估作为参数给出的表达式。如果启用了IDB,则反汇编程序的视图将与结果地址同步。地址不重定基础,并且没有IDB切换。对于动态分配/生成的代码特别有用。

!modmap:将合成(“伪造”)模块(使用其基地址和大小定义)添加到调试器内部列表。来自msdn:“如果重新加载了所有模块,例如,通过将Module参数设置为空字符串调用Reload,则所有合成模块都将被丢弃。”它可用于更轻松地调试动态分配/生成的代码。

!modunmap:删除基地址上先前映射的合成模块。

!modcheck   <   ||md5   >  :用于检查当前模块是否确实与IDB的文件匹配(例如:模块已更新)当不带参数调用时,将使用Debug Directory中的pdb的GUID。它可以替代地使用md5,但只能与本地调试对象一起使用(不适用于远程内核调试)。

!bpcmds   <   ||save|load|   >  :bpcmds封装器,保存并重新加载输出到当前IDB的.bpcmds(断点命令列表)。如果不带参数调用,则显示保存的数据。使用IDA的netnode功能可以实现持久存储。

!ks: 调试器标记语言(DML)增强了kv命令的输出。可以单击代码地址(!jmpto),也可以单击数据地址(dc)。

!translate : 从IDA(Alt-F2快捷方式)开始使用的含义,根据模块的名称和偏移量重新确定地址的基础。

地址可选参数

!cmt,!rcmt和!fcmt命令支持可选的地址选项:-a或--address。地址应作为十六进制值传递。命令解析基于python的argparse模块。要停止行解析,请使用--。

35.png

地址必须是有效的指令地址。

使用GNU gdb (GDB)

与主机同步:

36.png

GDB插件命令

使用没有“!”前缀的命令:

37.png

rln:从IDB获取给定地址的符号;

bbt: 美丽的回溯,类似于bt,但要求反汇编程序提供符号;

38.png

patch:根据实时上下文在反汇编程序中修补字节;

bx:漂亮的显示,与x相似,但使用符号,该符号将由反汇编程序解析。

cc: 继续在反汇编程序中,这是使用F3设置一次性断点和使用F5继续设置的替代方法。如果你更喜欢从gdb执行此操作,则这很有用。

39.png

LLDB的用法

1. 与主机同步:

40.png

2. 使用命令:

41.png

OllyDbg 1.10的用法

使用“插件”菜单或快捷方式来启用(Alt+s)/禁用(Alt+u)同步。

OllyDbg2的用法

使用“插件”菜单或快捷方式来启用(Ctrl+s)/禁用(Ctrl+u)同步,由于OllyDbg2 API处于测试版状态,因此仅实现了某些功能

x64dbg的用法

使用命令来启用(“!sync”)或禁用(“!syncoff”)同步。

已知漏洞和功能限制

1.使用Python 2.7/3.7、IDA 7.4 (Windows、Linux和Mac OS X)、Ghidra 9.1、GNU gdb (gdb)、7.4.1 (Debian)、lldb 310.2.37进行测试。

2. 双方之间没有任何认证/加密;

3. 自修改代码超出范围。

本文翻译自:https://github.com/bootleg/ret-sync如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/jLnB
如有侵权请联系:admin#unsafe.sh