透析挖洞神器mona.py插件新特性

前言

这里不得不用简单的篇幅介绍一下mona.py。这是由corelan team整合的一个可以自动构造Rop Chain而且集成了metasploit计算偏移量功能的强大挖洞辅助插件,详情可以参照他们的官方网站

当我在准备Derbycon的高级开发课程之前,还一直在玩IE的原始堆分配。其中有些问题给我带来了挫折(至少说,让我的整个研究进度都慢了许多)。反观,这也提高了我快速识别对象的能力,也是一个不错的机遇。毕竟,我是在尝试找一个包含任意数据的对象,或者指针,这做起来并不那么容易!

我决定给mona.py插件增加一些新的特性,以便让大家可以更快的寻找到感兴趣的对象。这些新特性仅仅在WinDBG下有效。

14211366922395

dumpobj (do)

这第一个新特性就是dumpobj。这条mona.py命令会转储对象中的内容,并提供内容中的有用信息。该命令有以下几个参数:

正如你看到的帮助信息,我们至少需要提供两个参数。

-a <address> : 开始的位置(对象的地址。当然,这个你可以自己随意定义)

-s <number> :对象的大小,如果你指定-s参数,mona会尝试自己定义一个大小。如果定义失败,那么mona会对这个对象转储0×28字节。

此外,你也可以告诉mona转储一些链接对象。-l参数后跟上一个数字,这个数字代表了递归转储的等级。由于性能的原因,会限制输出的大小,链接对象中只有第一个0×28字节的内容会输出给用户。当然,你也可以使用-m参数,看到更多内容。

在WinDBG中转储对象中的内容很繁琐。在某些情况下,dds/dc命令力度还是不够的,还需要做一些额外的工作才能够进一步分析这个对象和可选对象。

让我们来看看下面这个例子,假设我们在0x023a1bc0有一个0×78字节的对象。我们可以使用WinDBG命令转储这个对象中的内容。

Nice!我们可以看到很多东西—似乎是指针的值,nulls,以及一些垃圾数据。

使用mona,我们可以转储相同的对象,mona会尝试在对象中收集更多有关dword的信息。

很显然,对象中的某些值指向了字符串(ASCII and Unicode),其他的似乎指向了另外一个对象(ADVAPI32!g_CodeLevelObjTable+0×4)。这个看起来是不是要比使用dds/dc命令更方便呢?其实,我们还可以做得更好,我们还可以通知mona自动打印链接对象。接下来,我们再次使用mona命令并带上-L参数看看效果吧。

在上面的输出我们可以看到,mona确定源对象中包含了对2个链接对象的引用,并且转储了链接对象。最重要的是要知道mona不会把字符串 (ASCII or Unicode) 当作对象处理,因为mona已经显示了字符串,dumpobj命令的输出,最终会写入一个名为“dumpobj.txt”的文本文件中。

dumplog (dl)

显然,dumpobj命令能够十分轻松的获得一个对象的重要信息。如果你已经知道起始对象,这对你来说就更加方便了。

为了让世界清净下来,我决定使用dumplog去解析日志文件(基于某一语法),并在已经分配好的对象中执行dumpobj命令。在当前这个版本,dumplog并不能够转储链接对象,但是我准备给他加上这一特性。

Dumplog在使用前,需要进行一些设置。我们需要告诉WinDBG创建一个遵循特定协议的日志文件,当然了,我们需要在同一个调试会话中运行mona。

Dumplog的帮助信息如下:

这个想法是为了记录所有的堆分配以及自由操作。在WinDBG中可以通过以下步骤实现:

接下来,记录2个断点

(基于kernel32.dll最新版本, Windows7 SP1).

当RtlAllocateHeap 和RtlFreeHeap被调用时,这两个断点就会向WinDBG发送一个消息。

当你准备分析漏洞时,不要关闭WinDBG,关闭日志文件时使用.logclose命令。我们现在就可以使用mona解析日志文件了。

输出将被写入dump_alloc_free.txt文件

最后,希望你能够喜欢这两个新特性。