当你在CTF比赛中第一次遇到.sys文件时,是否感到无从下手?Windows驱动逆向确实比普通用户态程序更具挑战性,但掌握正确方法后,你会发现其中蕴含着令人着迷的技术细节。今天我们就以RCTF 2017的MyDriver2这道经典赛题为例,手把手带你破解驱动中的Inline Hook和简单加密逻辑。
与普通PE文件不同,驱动文件(.sys)运行在内核态,这意味着它们可以直接操作硬件和系统核心数据结构。对于逆向工程师来说,这既是挑战也是机遇——虽然分析难度更大,但往往能发现更有价值的安全问题。
用IDA打开MyDriver2.sys后,你会看到熟悉的PE结构,但函数调用和内存管理方式与用户态程序有所不同。几个快速定位关键代码的技巧:
ExAllocatePool、memmove等内核API提示:使用IDA的"Jump to segment"功能快速定位.text代码段,大多数核心逻辑都在这里。
在MyDriver2中,通过字符串交叉引用,我们很快定位到两个关键数据:
c复制qword_16310
qword_16390
这两个全局变量看起来像是加密数据的缓冲区。追踪它们的引用,我们发现核心逻辑位于sub_113C8函数中。这个函数做了以下几件事:
sub_11DF0复制0x22字节的代码到新分配的内存python复制# 动态代码执行的伪代码表示
v0 = ExAllocatePool(0, 0x22)
memcpy(v0, sub_11DF0, 0x22)
result = ((__int64 (*)(signed __int64, signed __int64))v0)(0xccc12345, 0x54321ccc)
这种动态生成代码并执行的技术在内核开发中很常见,也是CTF中经常考察的点。
深入分析sub_11DF0,我们发现它是一个简单的位操作函数:
c复制unsigned __int64 __fastcall sub_11DF0(__int64 a1, __int64 a2) {
return a2 & 0xF0F0F0F0F0F0F0F0ui64 ^ a1 & 0x0F0F0F0F0F0F0F0Fui64;
}
给定输入0xccc12345和0x54321ccc后,计算结果为0x5c3113c5。这个值随后被用作异或密钥来解密qword_16310指向的数据。
解密过程可以分为两个阶段:
第一阶段解密:
qword_16310缓冲区进行逐4字节异或0x5c3113c5第二阶段解密:
qword_16390缓冲区进行循环异或理解了算法后,我们可以用Python还原解密过程:
python复制from pwn import *
# 第一阶段解密
key1 = 0x5c3113c5
enc_data1 = [
0x5C5813A25C6E1395, 0x5C5413885C5413B3,
0x5C5013A95C57139A, 0x5C0213F75C6E13A2,
0x5C4913B15C1F13F6, 0x13B1
]
buf1 = b''
for num in enc_data1:
buf1 += p64(num ^ (key1 | (key1 << 32)))
# 第二阶段解密
enc_data2 = [
0x6105664765377470, 0x733A416D730C2011,
0x6E285F096C166D36, 0x6F5C686D6531690B,
0x780002726A5F58, 0x67005F00500074,
0x4D006500760069, 0x6C0066005F0065,
0x32005F00670061, 0x74002E00330033,
0x5F005000740078, 0x65007600690067,
0x66005F0065004D, 0x5F00670061006C,
0x2E003300330032, 0x50007400780074
]
buf2 = b''
for num in enc_data2:
buf2 += p64(num)
# 最终解密
flag = bytes([buf2[i] ^ buf1[i % 42] for i in range(len(buf2))])
print(flag.decode('utf-8'))
运行脚本后,我们得到了flag:RCTF{A_simple_Inline_hook_Drv}
这道题之所以命名为"MyDriver2",是因为它演示了一种简单的Inline Hook技术。让我们看看它是如何工作的:
sub_11DF0的代码复制到新分配的内存这种技术在真实的Rootkit中经常被用来挂钩系统调用。防御方法包括:
在CTF比赛中遇到这类题目时,记住以下排查步骤:
经过这道题的实战,我总结了几个驱动逆向的实用技巧:
SpinLock等同步原语对于想深入学习驱动安全的同学,建议从以下方向入手:
最后提醒一点:在实际分析未知驱动时,一定要在隔离环境中进行,避免系统崩溃或安全风险。