180126 逆向-JarvisOJ(BrokenDriver)(动态调试)

1625-5 王子昂 总结《2018年1月26日》 【连续第483天总结】
A. JarvisOJ-BrokenDriver
B.
Windbg一直想学,奈何不知道从何入手,这次借着驱动调试的机会终于实操

之前大体静态分析了一下,但是没有找到真正安装的方法和动态调试

首先使用DriverMonitor来安装和启动驱动

直接报错
这里写图片描述
这是因为驱动在启动时会检查CRC32的校验和
通过LoadPE可以一键修复,再启动就成功了

但是停止则会失败
这里写图片描述
显示,它没有卸载函数

结合之前静态分析可知,应该把sub_110A4赋值给DriverObject的Unload成员上。
将其Patch上以后会显示不正常:
180126 逆向-JarvisOJ(BrokenDriver)(动态调试)_第1张图片

实际上是重定位表错位,需要手动修复
顺手查了一波重定位表的相关知识

这里赋值的都是函数地址的绝对值,而由于内存加载基址可能改变,因此需要让加载器根据重定位表来修复这些绝对值
重定位表中保存的就是使用函数地址的地方

如sub_1102A的地址是11182-10000+3=1185,其中11182是该命令的起始地址,10000是基址,3是命令(mov xxx, offset name)中函数地址的偏移
在PE工具中查找
180126 逆向-JarvisOJ(BrokenDriver)(动态调试)_第2张图片
地址分别为1185、118C和1192
对照发现Patch后应该将第三个改为1193,修正后安装、启动和关闭都正常了
(记得要修正校验和)

分析代码可以发现,在MajorFunction[0]即Major_Create函数中,首先校验pid是否为360,然后申请了一块空间,并对某个值进行操作,放置在该空间中
在Unload函数中对该空间的值进行解密,结果放置于0x4000中

正常操作是创建一个设备来调用Major_Create函数,再关闭驱动来调用Unload函数,调试查看0x4000处的内存
创建设备的代码为

#include 
#include 
#define PAGE_SIZE 0x1000
#define OBJ_CASE_INSENSITIVE 0x00000040
#define FILE_OPEN_IF 0x00000003
#define KERNEL_NAME_LENGTH 0x0D
//main 函数
int main()
{
HANDLE DeviceHandle=NULL;
ULONG ReturnLength = 0;
PVOID MappedBase=NULL;
ULONG DllCharacteristics = DONT_RESOLVE_DLL_REFERENCES;
ULONG ShellCodeSize = PAGE_SIZE;
char DeviceName[] = "\\\\.\\360Dst";
HANDLE handle = CreateFile(DeviceName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(handle == INVALID_HANDLE_VALUE)
{
    printf("CreateFile error:%d\n", GetLastError());
    }
else
{
    printf("CreateFile succ\n");
}
return 0;
}

首先在虚拟机中完成双机调试的设置
流程可参考http://blog.csdn.net/sagittarius_warrior/article/details/51305046
PS: 我用的是XP系统,没有bcdedit,在C盘的boot.ini中添加启动项即可

再先后启动物理机的windbg和虚拟机系统即可

windbg会在启动系统的时候断下,此时下好驱动载入的断点
sxe ld 360dst.sys
然后g运行

断下来以后输入lm查看所有载入模块,找到驱动的地址
f8aa2000 f8aa9000 360dst (no symbols)
f8aa2000就是起始点,然后根据IDA中反编译的地址即可下断
bp f8aa2000 + 0x10f7

安装设备并终止,断下Unload函数
查看对应的内存即可

kd> da f8aa2000+4000
f8aa6000  "Cong.057e483b4694fc2866d1bd0b6fc"
f8aa6020  "a0f48"

得到flag

C. 明日计划
静态分析BrokenDriver

你可能感兴趣的:(CTF)