[原创][JarvisOJ] Broken Drivers -Writeup
0x00 序
- Auth: vvv_347
- Date: 12/09/2017
- From: Jarvis Oj
0x01 破
来自360ctf2015的Rev第一题(上来就是个驱动XD),这个学期正好开始接触WindowsDriver,拿来练练手还是不错。本题其实网上是有wp的(via.安全客),但个人认为小白理解起来难度不小(比如我),故本篇尽量写的详细点,也给自己做个记录。
涉及的知识:驱动基础,PE,双机调试,WinDbg使用。
Keyword:WindowsDriver|Debug|Rev
0x02 急
Winx86驱动,ida载入。
本题是一个有问题的驱动,要求我们patch。如果无法一眼就看出来哪里有问题,可以扔到虚拟机跑一下。首先发现安装成功,启动失败,打开Windows事件管理器(cmd: eventvwr->系统),看到报错:"并非有效的win32程序"。恭喜,撞到第一个坑。
网上找了一圈,发现是PE-checksum字段有问题,一般exe的校检为0,而重要的系统dll和驱动是要检查的,于是用LoadPE修改正确后,成功启动。接着停止驱动,ok,蓝了。
这边说下虚拟机环境,Win7x86x64原版镜像就算开启禁用签名强制模式也加载不上驱动,无奈只好选用ghost版本。
停止驱动蓝屏,肯定就去找找DriverUnload函数了,一看,没有调用。
那我们肯定是要把DriverUnload函数加到_Driver_Object-> DriverUnload处了,用WinDbg查看下结构,发现0x34是目标位置。
如果patch之后成了这样:
恭喜,撞到第二个坑。
这其实是重定位表出现了问题,mov的是个绝对地址。我们需要手动改重定位表。
可以参考两行指令,以MJ_Create为例:
需要重定位的位置为00011185,其中00010000为ImageBase,00001000为IMAGE_BASE_RELOCATION的其中一个VirtualAddress(rva),00000185为偏移,查看pe结构可以找到该字段:
顺藤摸瓜,找到重定位需要修改值的位置:
到这里就看出了,我们需要重定位的位置是00011193,但字段为192,修改为193就可以了。
再次载入,反编译ok:
这时就可以看看驱动到底做了什么
1. MJ_create:
先判断PID是不是360,如果不是直接报错,是则分配内存,并对其进行一个加密操作。
里面有起来是MD5的幻数,推测是生成一个key。
2. MJ_close:
没什么特别操作,不赘述了。
3. Driver_Unload:
对unk_14000进行操作的只有这一处,推测是利用src对其进行解密操作。
大致思路已经有了,可以先把判断pid==360的那处nop掉,再次调整checksum放到虚拟机准备双机调试,为此还需要一段代码来触发MJ_create,代码很简单只要CreateFile打开设备就可以,自己写吧。
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
