前置准备

因为驱动没有数字签名直接运行不行,我是把强制驱动签名关掉了

image-20250409160103776

静态分析ACEFirstRound.exe

驱动加载

image-20250408154658501

image-20250408154719203

a1+8()函数里面为

image-20250408154819310

通过这个加载驱动

image-20250408155228281

image-20250408155259850

image-20250408155435424

最终通过这个FilterSendMessage向驱动发送数据,驱动进行验证

r3层动调

直接调试时,有两个地方要注意,一个是r3层的反调试,一个是驱动对进程的权限提升,导致调试器调试不了

r3层反调试在这里

image-20250408211038565

image-20250408211930623

创建了个线程进行反调试

image-20250408211831848

把这个nop掉就能过了

image-20250408212054167

然后是驱动对进程的进程的权限提升

ida附加不上

image-20250408210715667

image-20250408212250006

听别的师傅说xdbg好用点有反反调试插件,直接能跑,哎,我是废物,没有插件qwq

其实这个问题也好解决,两个方法

第一个就是nop掉加载驱动的函数,就只先分析r3层的

第二就是找到内核提升权限的标志位,改成普通的就行

说下第二个怎么弄

进入windbg本机附加内核,程序起起来

image-20250408212931389

重点在

image-20250408213009153

image-20250408213325240

具体结构类型在下面

PS_PROTECTION - NtDoc

在驱动里面是这样写的(在驱动的导入函数里找到PsGetCurrentThreadProcessId向上找到调用就找到了)

image-20250408220852607

image-20250408220907027

当前数值为0x62,type为0y010就是处于保护状态

直接修改其值为0就行

改完后就可以正常附加了

image-20250408214827568

image-20250408214851874

接下来就是愉快的调试分析了

比较了长度范围和前几个字符为’ACE_’

image-20250408214950320

base58

image-20250408215201136

image-20250408215225202

然后又加个@,在逆序

image-20250408215609376

在异或sxx

最后向驱动发送数据

image-20250408220435736

r0层静态

静态分析驱动有好多花

image-20250408221214627

去除掉即可

找到

image-20250408224202943

这个下面会用到

image-20250408221631716

这里就是驱动加密的地方

但是直接解密就错了

驱动对tea加密进行了inlinehookimage-20250408223012806

image-20250408222926017

r0层动态

windbg进行双机调试

通过bu ACEDriver!DriverEntry设置预加载断点,在加载驱动时断下

image-20250408223513892

在上面我们发现传入驱动时

image-20250409151959880

image-20250409152053382

我们windbg断点下在这里

image-20250409152509490

在往下跟跟

看这两个参数

image-20250409153551959

image-20250409153712666

我们发现这个参数就是程序传入驱动的数据和大小

image-20250409153512721

接着跟进

image-20250409154203165

tea分成了四段

image-20250409154306145

image-20250409154341410

image-20250409154414856

image-20250409154513270

但是第三段其实就是第一段的后半部分,所以我们把这段内存dump出来

用windbg这个命令

1
.writemem C:\dump.bin fffff803`8c631000 L95

后面的参数是dump的位置 起始地址 大小

合并下再放入ida里改下跳转

得到真正的加密

image-20250409155016050

密文再驱动里能直接看到

image-20250409155055576

解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include<stdio.h>

__int64 tea(unsigned int *a1, int *a2)
{
__int64 v2; // rbx
unsigned int v3; // esp
__int64 v4; // rbp
__int64 v5; // rdi
__int64 v6; // rsi
unsigned __int64 v7; // rax
int v9; // ebx
unsigned int v10; // r11d
int v11; // edi
unsigned int v12; // r9d
__int64 v13; // rdx
unsigned int v14; // r10d
__int64 result; // rax


v9 = *a2;
v10 = 0;
v11 = a2[1];
v12 = *a1;
v13 = 32;
v14 = a1[1];

do
{
v10 -= 0x61C88647;
--v13;
}while ( v13 );
v13 = 32;

do
{
// v10 -= 0x61C88647;
// v12 += (v10 + v14) ^ (v9 + 16 * v14) ^ (v11 + (v14 >> 5));
// v14 += (v10 + a2[(v10 >> 11) & 3]) ^ (v12 + ((16 * v12) ^ (v12 >> 5)));



v14 -= (v10 + a2[(v10 >> 11) & 3]) ^ (v12 + ((16 * v12) ^ (v12 >> 5)));
v12 -= (v10 + v14) ^ (v9 + 16 * v14) ^ (v11 + (v14 >> 5));
v10 += 0x61C88647;

--v13;
}
while ( v13 );
*a1 = v12;
a1[1] = v14;
return 0;
}

int main(){


unsigned int mi[]={0x0ec367b8,
0xc9da9044,
0xda6c2deb,
0x88ddc9c3,
0x32a01575,
0x231dd0b4,
0x4b9e8a74,
0xd75d3e74,
0xeaab8712,
0xe704e888,
0xe01a31ac,
0xecae205c,
0xa7be7467,
0x0c6252a3,
0x1aefec4e,
0xc40ded44,
0xc3c842cc,
0xde4a0c0e,
0x7c24f3fc,
0x8fb8d001,
0x11153e6e,
0x530ed15c,
0xf4214811,
0xbeb517e0,
0x63f91634,
0x4d96f8a5,
0xfe23eac8,
0x2c607adf,
0xcc43d85c,
0xff186c5b,
0x8763e1a5,
0x9187bd58,
0x87d1069b,
0xd7878d7b,
0x836e6b68,
0x55a0c63f,
0xd979fdb3,
0x3e524dee,
0x7ab35c82,
0xa2f4da8d,
0x1708ba4c,
0x710653e6,};



int key[4]={0x41,0x43,0x45,0x36};
for(int i=0;i<42;i+=2) {
tea(&mi[i],&key[0]);
}

for(int i=0;i<42;i++){
printf("%02x ",mi[i]);
}



return 0;
}

image-20250409155212811

所以flag为ACE_We1C0me!T0Z0Z5GamESecur1t9*CTf

小结

哎,最简单的一年,可惜了,我太菜了qwq

当时比赛时确实什么都不会,第一次做有关内核的,比赛只想着怎么动调了,静态也没怎么看,看别的师傅直接静态出了,tql,我数字签名搞了一天,哎qwq