xwings在ZeroNights 2019中曾提及,Qiling模拟执行框架开发出来的目的是为了模拟执行各种操作系统中的shellcode,以应对复杂度不断增长的shellcode。作为一个二进制分析和模拟执行框架,它支持跨平台(如Windows 和Linux),多架构(如ARM和x86),和多种文件格式(如ELF和Portable Executables)。
当试图为Windows系统API贡献代码,提高其覆盖率时,我发现难以追踪到那些调用了特定API的代码的执行流,而我想要模拟执行的代码正是这部分.万幸的是,@assaf_carlsbad提交了一个PR,这个PR使用了DRCOV-compatible代码覆盖率,刚好能实现我想要的功能。但它原本的代码只支持PE UEFI Loader,以我决定为它添加PE Loader的支持.修改如下所示:
这部分代码可以为任意loader加载起来的PE内存镜像提供代码覆盖率信息(也包括DLL依赖),当追踪开启时,可通过block_callback
这一函数回调打印出每个基本块的执行日志。
我把这篇博客搁置了一段时间,后来发现xwings在6月份已经把这一功能添加到PE中了,所以我提交了一个PR以支持获取DLL的代码覆盖率。
在IDA Pro和二进制Ninja中的可视化代码覆盖率功能,其事实标准是一个叫作Lighthouse的插件。如果你使用上述两种反汇编器,我强烈推荐你使用它。在我的业余时间,我一直在尝试使用Ghidra,它有一个很棒的反汇编器和反编译器,并且它还提供了大量IDA Pro缺少的功能。一旦你习惯了它的用法,你会发现它是一个非常棒的自由开源的逆向工具。我偶然间发现了一个叫做Dragon Dance的插件,它能在Ghidra中提供和Lighthouse相似的代码覆盖率可视化功能,更重要的是,它支持本文中提到的DRCOV追踪格式。它支持大量的内置引用,能够让你做到诸如在高亮语法中进行diff
追踪这样的功能。下面是从README中摘录的一段文字,介绍如何用这些函数来实现脚本接口。
除此之外,Dragon Dance支持还有修复功能,它本质上是将二进制文件中的代码覆盖率完整性与Ghidra反汇编出的指令进行比较。如果这两者不同,插件会提示用户修复Ghidra缺失的部分。下面也是从README中摘录的一段介绍:
现在我们已经能够追踪PE覆盖率,而且能够在逆向工程软件中将它可视化。接下来看一个例子,Qiling附带了一个WannaCry的二进制文化,我们用它来进行举例。首先,要想安装它,我需要依照Dragon Dance中的编译步骤将它编译出来,编译步骤非常简单。编译并安装之后,就可以在Ghidra中使用它了。我运行qltool
并启用追踪功能来对WannaCry进行分析。
传递给qltool的几个选项功能如下:
如你所见,在我们模拟执行的过程中,这个臭名昭著的开关URLhxxp://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea[.]com
被传给了InternetOpenUrlA
。接下来,我们使用Dragon Dance把trace文件导入Ghidra
中,看看它的结果,如果已经安装了插件,可以从Ghidra的Window
下拉菜单中打开插件窗口。
打开Dragon Dance窗口之后,使用绿色的+
按键添加一个trace文件。
文件添加好后,在文件上右键,点击Switch To
进入这个文件。
经过上述操作后,所有可执行/模拟的区域都已经高亮显示了,在这里我们能看到WannaCry调用的开关函数。
如果上述步骤你都跟过来了,你会发现WannaCry最后结束在sprintf
函数中。
我们可以看到,在msvcrt.dll
中调用sprintf
的代码后面,指令都没有高亮了:
我们可以用Dragon Dance可视化msvcrt.dll
的依赖,也就是它本身的代码覆盖率。以此找到异常发生的地方:
这是我碰到的Qiling的一个局限,因为Qiling使用Unicorn执行机器码的基本块。当执行某个基本块时发生了异常(也就是本例中的场景),它不会触发日志回调。尽管如此,你还是可以用这个可视化功能来寻找问题发生的地方。如果我们想要程序继续执行,有两种方案:
这是一个调试模拟输出的基本例子,因为从qltool
的输出中我们能够很明显地看出到底发生了什么,然而,想要可视化一些复杂例子中的执行路径,其开销是非常大的,因为很多分支可能会进入一个特定的函数中,从而触发错误或未定义行为。Qiling框架正在积极开发中,我几天每天都能在Github上看到它的更新。核心开发人员在维护项目方面做得很好,我建议大家使用这些技术来调试API,并为这个项目贡献一些代码。
逆向快乐!
原文链接
翻译:看雪翻译小组 梦野间
校对:看雪翻译小组 lumou
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课