Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮

0x1前言

从windbg preview版本出现后,新增的时间旅行调试(TTD)就是一个非常好用的功能。它改变了目前调试分析Windows app漏洞时候一遍遍的栈回溯、bp断点、重新加载等问题。大大提高了windows app漏洞分析过程的效率。还可以将调试过程保存成文件,方便分享给他人调试。

本文从几个例子来介绍下新功能的用法。

0x2基本介绍

Windbg preview需要从微软商店下载、安装。以管理员加载程序即可。Configure recording保存调试的流程解析。图片[1]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

启动界面后,主要有两大块需要介绍,左侧红框倒叙部分以及右侧Timelines。Timelines会记录下包括异常、断点、函数调用、内存访问。如下图三角所示。

图片[2]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

0x3示例

1)利用TTD分析除以0异常

源码大致如下:

int f_vulzero(int c)

{

        int a = c – 1;

        int b = a * 3;

        int d = a * b * 0;

        return d;

}

使用windbg preview TTD配置加载异常程序运行后,Timelines会自动记录异常并暂停等待。此时至少需要我们双击下图右侧Timelines小三角,获取异常处代码如下图。

图片[3]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

从图中可见问题出现在idiv除以了0.那么ebp-8为什么是0?

在传统windbg调试中,这里需要我们kv去回溯栈层,顺便使用IDA分析代码总体流程,然后在windbg 中bp addr上,g运行,达到指定断点地址后,接着“单步调试”,直到触发此问题。如果断点错误,可能还需要再一次restart,费时费力。

然而在windbg preview TTD功能中,我们只需要使用step into back 或 t-命令即可。此时发现ebp-8来自eax。如下图所示。

图片[4]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

那么继续t- 操作,发现eax来自于前函数,此时eax值为0x63。但是我们好像错过了关键信息mov eax,dword ptr[ebp-20h];如下图。那么直接通过step into 或 t命令,可以看到Imul ecx,eax,0之后,ecx=0;eax的值就来源于ecx,接着进入call    chuyi0+0x11235单步就发现idiv 除以0异常原来是来自于:imul ecx,eax,0这条指令。

图片[5]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科图片[6]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

至此这个漏洞分析完毕,而且不需要多次重复加载调试。大大简化了流程。

2)利用TTD分析栈溢出漏洞

源码大致如下:

int f_vul(char str[])

{

        char buf[8];

        strcpy(buf, str);

        return 1;

}

加载进入程序后,g一下,程序直接崩溃。观察图,可以发现通过如下位置发生了栈溢出的问题。下图很简单,eip执行找不到内容,所以直接crashed了。通过下图右侧红框中,我们也可以发现栈溢出的位置。

图片[7]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

那么这个漏洞怎么分析呢?老规矩,直接“step over back”一下,顺便看Stack栏中的内容。几次“step over back”后,可以看到问题出现在stackover!f_vul函数内。如下图所示,那么直接将断点下载f_vul函数上,然后“step out back”之后,重新点击“Go”命令运行。

图片[8]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

当windbg preview命中断点后,step into一下,uf .命令查看整个汇编语句,我们就可以发现strcpy可能存在问题了。然后单步调试即可。

图片[9]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

那么怎么确定我们传入的参数呢?

还记得我们栈溢出eip被覆盖把。通过kb命令,我们查看第一个传递进来的参数是0x9afd2c。通过dc查看,也可以发现传递进来的字符串。如下图所示。

图片[10]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

接着执行到mov eax,1的时候,ebp的空间被覆成如下所示。即可知道eip栈溢出问题出现在strcpy啦。

3)利用windbg 加载镜像调试环境。

新版本windbg preview除了上述调试外,还可以很方便的加载调试过的记录。方法:

Start debugging -> open trace file -> 选择自己的镜像文件即刻。调试起来就如同调试程序进程一样方便。如下图所示。

图片[11]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科图片[12]-Windbg preview 时间旅行调试(TTD)介绍 – 作者:中国电信安全帮-安全小百科

0x4总结

本文以几个简短的例子来说明TTD功能的使用,同时抛砖引玉希望越来越多的人接纳使用windbg preview,因为它的确带来了很大的便利性。但是TTD也有不足之处,比如加载大型文件时候,记录过程较为缓慢、生成的run文件体积很大、不支持win7、win10 pro以外的版本等等。但是瑕不掩瑜,使用TTD功能调试漏洞时候,再也不会担心内存变量,环境位置的改变了,极大的方便了分析调试使用,期待windbg preview越来越好吧。

作者:中国电信安全帮攻防团队 张道全 吴涛

来源:freebuf.com 2020-07-15 10:27:40 by: 中国电信安全帮

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论