0x1前言
从windbg preview版本出现后,新增的时间旅行调试(TTD)就是一个非常好用的功能。它改变了目前调试分析Windows app漏洞时候一遍遍的栈回溯、bp断点、重新加载等问题。大大提高了windows app漏洞分析过程的效率。还可以将调试过程保存成文件,方便分享给他人调试。
本文从几个例子来介绍下新功能的用法。
0x2基本介绍
Windbg preview需要从微软商店下载、安装。以管理员加载程序即可。Configure recording保存调试的流程解析。
启动界面后,主要有两大块需要介绍,左侧红框倒叙部分以及右侧Timelines。Timelines会记录下包括异常、断点、函数调用、内存访问。如下图三角所示。
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小三角,获取异常处代码如下图。
从图中可见问题出现在idiv除以了0.那么ebp-8为什么是0?
在传统windbg调试中,这里需要我们kv去回溯栈层,顺便使用IDA分析代码总体流程,然后在windbg 中bp addr上,g运行,达到指定断点地址后,接着“单步调试”,直到触发此问题。如果断点错误,可能还需要再一次restart,费时费力。
然而在windbg preview TTD功能中,我们只需要使用step into back 或 t-命令即可。此时发现ebp-8来自eax。如下图所示。
那么继续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这条指令。
至此这个漏洞分析完毕,而且不需要多次重复加载调试。大大简化了流程。
2)利用TTD分析栈溢出漏洞
源码大致如下:
int f_vul(char str[])
{
char buf[8];
strcpy(buf, str);
return 1;
}
加载进入程序后,g一下,程序直接崩溃。观察图,可以发现通过如下位置发生了栈溢出的问题。下图很简单,eip执行找不到内容,所以直接crashed了。通过下图右侧红框中,我们也可以发现栈溢出的位置。
那么这个漏洞怎么分析呢?老规矩,直接“step over back”一下,顺便看Stack栏中的内容。几次“step over back”后,可以看到问题出现在stackover!f_vul函数内。如下图所示,那么直接将断点下载f_vul函数上,然后“step out back”之后,重新点击“Go”命令运行。
当windbg preview命中断点后,step into一下,uf .命令查看整个汇编语句,我们就可以发现strcpy可能存在问题了。然后单步调试即可。
那么怎么确定我们传入的参数呢?
还记得我们栈溢出eip被覆盖把。通过kb命令,我们查看第一个传递进来的参数是0x9afd2c。通过dc查看,也可以发现传递进来的字符串。如下图所示。
接着执行到mov eax,1的时候,ebp的空间被覆成如下所示。即可知道eip栈溢出问题出现在strcpy啦。
3)利用windbg 加载镜像调试环境。
新版本windbg preview除了上述调试外,还可以很方便的加载调试过的记录。方法:
Start debugging -> open trace file -> 选择自己的镜像文件即刻。调试起来就如同调试程序进程一样方便。如下图所示。
0x4总结
本文以几个简短的例子来说明TTD功能的使用,同时抛砖引玉希望越来越多的人接纳使用windbg preview,因为它的确带来了很大的便利性。但是TTD也有不足之处,比如加载大型文件时候,记录过程较为缓慢、生成的run文件体积很大、不支持win7、win10 pro以外的版本等等。但是瑕不掩瑜,使用TTD功能调试漏洞时候,再也不会担心内存变量,环境位置的改变了,极大的方便了分析调试使用,期待windbg preview越来越好吧。
作者:中国电信安全帮攻防团队 张道全 吴涛