欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创][JarvisOJ] Broken Drivers -Writeup

[原创][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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功