GKCTF2020 BabyDriver

.sys文件

扔进ida,查看字符串,感觉是迷宫题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
****************
o.*..*......*..*
*.**...**.*.*.**
*.****.**.*.*.**
*...**....*.*.**
***..***.**.*..*
*.**.***.**.**.*
*.**.******.**.*
*.**....***.**.*
*.*****.***....*
*...***.********
**..***......#**
**.*************
****************

跟进主要逻辑

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
_int64 __fastcall sub_140001380(__int64 a1, __int64 a2)
{
__int64 v3; // rdi
__int64 v4; // rax
int v5; // ecx
__int16 *v6; // rsi
__int64 v7; // rbp
__int16 v8; // dx
char v9; // dl
const CHAR *v10; // rcx

if ( *(int *)(a2 + 48) >= 0 )
{
v3 = *(_QWORD *)(a2 + 24);
v4 = *(_QWORD *)(a2 + 56) >> 3;
if ( (_DWORD)v4 )
{
v5 = dword_1400030E4; // 10h
v6 = (__int16 *)(v3 + 2);
v7 = (unsigned int)v4;
while ( *(_WORD *)(v3 + 4) )
{
LABEL_28:
v6 += 6;
if ( !--v7 )
goto LABEL_29;
}
aO[v5] = '.'; // '.'为通路
v8 = *v6;
if ( *v6 == 23 ) //opcode为23
{
if ( (v5 & 0xFFFFFFF0) != 0 )
{
v5 -= 16; //根据迷宫为16一行,猜测这是“上”
goto LABEL_21;
}
v5 += 208;
dword_1400030E4 = v5;
}
if ( v8 == 37 ) //opcode为37
{
if ( (v5 & 0xFFFFFFF0) != 208 )
{
v5 += 16; //"下"
goto LABEL_21;
}
v5 -= 208;
dword_1400030E4 = v5;
}
if ( v8 == 36 ) //opcode为36
{
if ( (v5 & 0xF) != 0 )
{
--v5; //"左"
goto LABEL_21;
}
v5 += 15;
dword_1400030E4 = v5;
}
if ( v8 != 38 ) //opcode为38
goto LABEL_22;
if ( (v5 & 0xF) == 15 )
v5 -= 15;
else
++v5; //"右"
LABEL_21:
dword_1400030E4 = v5;
LABEL_22:
v9 = aO[v5];
if ( v9 == '*' )
{
v10 = "failed!\n";
}
else
{
if ( v9 != 35 )
{
LABEL_27:
aO[v5] = 'o'; //'o'为起点
goto LABEL_28;
}
v10 = "success! flag is flag{md5(input)}\n";
}
dword_1400030E4 = 16;
DbgPrint(v10);
v5 = dword_1400030E4;
goto LABEL_27;
}
}
LABEL_29:
if ( *(_BYTE *)(a2 + 65) )
*(_BYTE *)(*(_QWORD *)(a2 + 184) + 3i64) |= 1u;
return *(unsigned int *)(a2 + 48);
}

中间变量看着眼花,找有关迷宫的数值猜测关键操作(我是菜狗没办法……猜!)

这里用数字写的flag不对,查了很多资料,了解了相关知识

相关知识点

键盘扫描码 键盘虚拟码 ASCII码

​ 扫描码是键盘对应按键的编码,与硬件相关,不同厂商对同一个键的扫描码有可能不同。为了统一这种差异,计算机接受到的扫描码交给键盘驱动程序,将扫描码转化为虚拟码(同一个键的虚拟码相同)。而为了便于记忆,有部分键存储为对应ASCII码。(eg:字母存为大写字母的ASCII码)

​ 存储方式:键盘上的每一个键都有两个唯一的数值进行标志,标志敲击与释放。 “普通键”的低8位数存放该字符的ASCII码。对于特殊键( 特殊键包括箭头键、功能键等 ),低8位为0,高8位字节存放该键的扫描码。

.sys文件

sys是Windows的系统文件,sys文件是驱动程序的可执行代码,其扩展名为.sys。(这个题就是的.sys文件就是系统驱动程序,接收的是键盘扫描码,所以对应的是I,K,J,L)

解题

手动解迷宫:LKKKLLKLKKKLLLKKKLLLLLL

flag{403950a6f64f7fc4b655dea696997851}