(十六)、MyDriver2-397
攻防世界第69题

下面是我分析的思路,可能有点啰嗦
一、 查壳

驱动文件

二、IDA静态分析
搜字符串什么都没搜到,直接进入 DriverEntry
1、DriverEntry


这三个是 0 3环通信时用到的,点开回调函数后,并没有发现什么

这个函数在卸载驱动的时候触发,点进去

注意 sub_115DC 这个函数,再点进去

经过后面的分析, Src是原 NtCreateFile 的地址
注意memmove,实际上就是在修改 NtCreateFile 函数的前几个字节的值,想到设备名叫
\\Device\\Myhook,可以猜到这里是Hook后的恢复,应该是InlineHook


继续回到DriverEntry

这一块是对0 3 环通信的处理,与我们找flag关系不大
2、sub_11008 函数

仅仅是创建了一个文件
3、sub_113C8 函数

这里对 byte_16310 数组与 byte_16390数组进行了处理,很奇怪,凭空进行处理,记住它
4、sub_110B8 函数

看这里

转成16进制

倒着看,FF25….FFFF ff25 跳转语句的硬编码
再结合后面代码,可以判断 sub_110B8 函数的功能就是进行InlineHook
这个函数前一半构造了v9这个函数,v9会跳转到NtCreateFile的位置
这个函数后一半对 NtCreateFile 函数进行了InlineHook,使程序执行NtCreateFile函数的时候跳转到sub_114D0函数的位置
该函数返回值为v5,返回值赋给Src,保存InlineHook前的环境,在驱动卸载的时候恢复原来函数的样子
由于v9函数是在InlineHook之前构造的,所以执行v9这个函数触发NtCreateFile的时候不会跳转到sub_114D0
到这里,程序戛然而止,考虑到该驱动进行了03环通信,那么NtCreateFile函数应该是三环代码触发的,当三环程序执行CreateFile的时候,CreateFile函数内部会调用NtCreateFile函数,那我们就点开sub_114D0 函数
5、sub_114D0 函数


这个 qword_16420 就是v9,构造的NtCreateFile

dword_16428 是全局变量,每次调用NtCreateFile的时候 dword_16428就会加一
当dword_16428 值为7的时候触发 if语句,执行if语句中的函数

6、sub_115DC函数

这个函数的主要功能是恢复InlineHook
7、sub_112B4函数

点进去
这个函数的功能就是把字符串写入·文件

写入的是 byte_16390 字符串
猜测写入·的 byte_16390 字符串就是flag
交叉引用

8、重回 sub_113C8 函数
观察代码逻辑,这个函数对 byte_16390 函数进行了简单的加密处理
结合 sub_114D0 函数,写出解密脚本
三、解密脚本
byte_16390 = [ 0x70, 0x74, 0x37, 0x65, 0x47, 0x66, 0x05, 0x61, 0x11, 0x20, 0x0C, 0x73, 0x6D, 0x41, 0x3A, 0x73, 0x36, 0x6D, 0x16, 0x6C, 0x09, 0x5F, 0x28, 0x6E, 0x0B, 0x69, 0x31, 0x65, 0x6D, 0x68, 0x5C, 0x6F, 0x58, 0x5F, 0x6A, 0x72, 0x02, 0x00, 0x78, 0x00, 0x74, 0x00, 0x50, 0x00, 0x5F, 0x00, 0x67, 0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x32, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x78, 0x00, 0x74, 0x00, 0x50, 0x00, 0x5F, 0x00, 0x67, 0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x67, 0x00, 0x5F, 0x00, 0x32, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x78, 0x00, 0x74, 0x00, 0x50, 0x00] byte_16310 = [ 0x95, 0x13, 0x6E, 0x5C, 0xA2, 0x13, 0x58, 0x5C, 0xB3, 0x13, 0x54, 0x5C, 0x88, 0x13, 0x54, 0x5C, 0x9A, 0x13, 0x57, 0x5C, 0xA9, 0x13, 0x50, 0x5C, 0xA2, 0x13, 0x6E, 0x5C, 0xF7, 0x13, 0x02, 0x5C, 0xF6, 0x13, 0x1F, 0x5C, 0xB1, 0x13, 0x49, 0x5C, 0xB1, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] v1 = 0x54321CCC & 0xF0F0F0F0F0F0F0F0 ^ 0xCCC12345 & 0xF0F0F0F0F0F0F0F v2 = v1 - 0x5C31139B # print(v2) for i in range(32): byte_16310[4*i] ^= (v1 & 0x000000ff) byte_16310[4*i+1] ^= ((v1 & 0x0000ff00)>>8) byte_16310[4*i + 2] ^= ((v1 & 0x00ff0000)>>16) byte_16310[4*i + 3] ^= ((v1 & 0xff000000)>>24) byte_16310[v2] = 0 byte_16310[v2 + 1] = 0 v4 = 0 for i in range(128): byte_16390[i] ^= byte_16310[v4] v4 = (v4 + 1) % v2 k = 0 for i in byte_16390: if (i == 0): break else: k= k + 1 for i in range(k): print(chr(byte_16390[i] & 0xff),end = '')
四、拿到flag
the flag is A_simple_Inline_hook_Drv
五、总结
64位的好多知识自己还没有实验过,得把64位的学习提上日程

浙公网安备 33010602011771号