180116 逆向-JarvisOJ-BrokenDrivers(初步分析)

本文通过IDA反编译解决JarvisOJ-BrokenDriver挑战,详细解析了驱动程序的问题所在,包括驱动对象的创建、调试过程中的Bug定位与修复策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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第一天~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值