1625-5 王子昂 总结《2018年1月16日》 【连续第473天总结】
A. JarvisOJ-BrokenDriver(1)
B.
本题是驱动的修复及调试……(:з」∠)
拿到sys文件,发现是PE格式,于是直接IDA反编译
沿着DriverEntry向里查找,发现这里
这里创建了硬件设备对象和符号链接并传入DriverObject
MajorFunction就很明显了
查看DriverObject结构体及其介绍可以更好地理解这些作用
https://www.cnblogs.com/zhuyp1015/archive/2012/03/14/2396560.html讲的挺好
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION];
指向驱动程序的DispatchXXX函数指针的数组。每个驱动程序至少要设置一个DispatchXXX函数指针在这个数组里来处理这个驱动程序IRP请求包。需要设定一些默认的分发函数(DIspatchXXX)来处理一些默认的IRP包。
查看这两个函数发现前者设置了一个全局变量和IRP的状态,后者则只是析构处理
这个全局变量挺令人在意,于是查看交叉引用,发现了另一个函数sub_110a4
这里看起来也是在释放内存什么的,但是对p有一个判断, 而P是一个指针,来自于sub_1102A中的申请
而这个申请的前提是Irp的请求进程的ID=360
这个要求有点困难,干脆Patch掉好了
另一个关键是查看sub_110A4的交叉引用,发现调用在一个很有趣的地方
.text:00011182 loc_11182: ; CODE XREF: sub_11118+5Dj
.text:00011182 mov dword ptr [edi+38h], offset sub_1102A
.text:00011189 mov dword ptr [edi+40h], offset sub_11006
.text:00011190 push eax
.text:00011191 mov eax, offset sub_110A4
.text:00011196 pop eax
这里上面两行就是DriverObject->MajorFunction的赋值,而最后引入了sub_110A4却又直接覆盖了
结合题目,很明显这里就是Bug点了
那么这个函数应该用在哪里呢?
函数中删除了符号链接,于是从这个关键点搜索
发现通常这一行为在Unload函数中进行
查看DriverObject结构体的偏移,发现Unload成员是0x34偏移,于是即可进行Patch
然后不会动态调试,GG
之前做的驱动相关的题目只学会在DbgViewer里看DbgPrint
下次试试虚拟机的内核调试吧
PS:作为一个逆向选手惯例先静态分析一波,sub_11482这个函数很可疑,跳进去看一下是对unk_14000处的代码进行了解密
然而内部需要P的值,P的值在sub_114A8中初始化,该函数极为复杂还原困难。。。
后来又想起来这么复杂的函数一般都是现成的密码学,于是用插件跑了一下,发现果然能大概理清结构了
使用了MD5和BlowFish两个算法进行处理
但是具体的源数据和key还没有理清楚……
下一步思考吧~
C.明日计划
XMAN第一天~