本章我们将深入到winXP的内核当中,使用Windbg进行令人望而却步的内核调试。但困难终将被克服,让我们开始新的征途吧!
Lab10-01
依然,我们采取任务导向方式,首先看一下本次的问题

首先,我们依旧借用strings来分析程序的静态特征,我们可以发现exe中使用到了一些关于服务的函数,并且调用了将宽字符转为Unicode的函数。并且我们知道,一般windows内核态会使用Unicode编码,而用户空间使用的是宽字符,因此我们推测这个程序有可能涉及到了内核空间,动态调试要借助windbg了;同时我们也看到了sys文件中的注册表操作函数和一个驱动文件的路径,那么我们更加确定该程序将会进入内核空间了。


此时其实我们的第一问已经可以回答了,但保险起见,让我们使用Process Monitor观察一下程序的操作吧:可以看到此处使用了RegSetValue函数,由此判断确实改变了注册表的值

此时我们先不急着使用windbg,而是利用IDA先对该程序进行初步的分析,先分析EXE文件

可以看到我们首先打开了远程管理器。但这些参数的具体意义该如何得知呢?笔者在这里记录一种方法,用于加载windows标准常量



接下来我们便可以一一地把windows的常量加载到程序中了,那么这里的两个0表示连接到本地并且使用默认数据库,同时请求获得所有访问权限

接下来我们分析一下后续的操作,首先尝试创建一个Lab10-01服务,运行sys文件;如果服务存在导致创建失败那便直接Open同名服务,然后启动该服务,最后使用controlService停止该服务。这便是exe的主流程了,看来我们还是要着重分析一下sys文件

我们进入sys的分析界面以后,可以看到两个跳转,第一个跳转是一个防止栈溢出的函数。如果你熟悉pwn的话,那么该操作其实就是初始化栈中的Canary。第二个跳转便是真正进入Driver主程序的部分

反汇编以后可以发现,主函数的作用就是将sub_10486注册到Driver的回调函数,在驱动被卸载的时候使用

我们进入回调函数内部分析一下:可以看到,这个函数的主要操作便是创建一系列注册表键,然后对防火墙策略文件进行修改,从而影响防火墙的行为

可以看到Valuename为EnableFirewall,而ValueData的值是由edi给出的,但我们的edi在函数开头便初始化为0,所以此处注册表值的作用应该是关闭防火墙


那么此时第三问其实已经解决了,我们搞清楚了这个程序的作用。将目光转回到第二问上,我们此时来配置VMware使用windbg联调的基本操作

在boot.ini后多加一行debug的配置参数(笔者建议在此之前先拍摄快照,防止无法运行)
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional with Kernel Debugging" /noexecute=optin /fastdetect /debug /debugport=COM1 /baudrate=115200
然后我们在虚拟机设置中再新添串口,配置如图所示

接下来我们打开windbg,准备连接到WinXP虚拟机,在File中选择kernel debugging,配置如下:

启动界面选择我们刚才配置的选项

然后观察windbg中的log,发现如下信息,证明已经连接成功了

由于恶意程序会在运行结束的时候自动卸载驱动,因此我们若想在windbg中看到该驱动,首先应该使用动态分析方法,运行程序到ControlService之前,通过IDA分析,可知断点应该为bp 00401080
(鉴于windbg工具问题,本篇暂时停止更新,调试好了以后在进行更新)