re每日一题(20200528)
BabyDriver
2020GKCTF
64位驱动逆向,函数不是很多。看到\\Driver\\Kbdclass
可以感觉是个键盘驱动,且调用了KdDisableDebugger()
具有反调试。既然是CTF,就不需要完全分析,直接找关键地方。可以在sub_140001380
找到flag的关键。
__int64 __fastcall sub_140001380(__int64 a1, __int64 a2)
{
__int64 v2; // rbx
__int64 v3; // rdi
__int64 v4; // rax
int v5; // ecx
__int16 *v6; // rsi
__int64 v7; // rbp
__int16 v8; // dx
char v9; // dl
CHAR *v10; // rcx
v2 = a2;
if ( *(a2 + 48) >= 0 )
{
v3 = *(a2 + 24);
v4 = *(a2 + 56) >> 3;
if ( v4 )
{
v5 = dword_1400030E4;
v6 = (v3 + 2);
v7 = v4;
while ( *(v3 + 4) )
{
LABEL_28:
v6 += 6;
if ( !--v7 )
goto LABEL_29;
}
aO[v5] = 46;
v8 = *v6;
if ( *v6 == 23 )
{
if ( v5 & 0xFFFFFFF0 )
{
v5 -= 16;
goto LABEL_21;
}
v5 += 208;
dword_1400030E4 = v5;
}
if ( v8 == 37 )
{
if ( (v5 & 0xFFFFFFF0) != 208 )
{
v5 += 16;
goto LABEL_21;
}
v5 -= 208;
dword_1400030E4 = v5;
}
if ( v8 == 36 )
{
if ( v5 & 0xF )
{
--v5;
goto LABEL_21;
}
v5 += 15;
dword_1400030E4 = v5;
}
if ( v8 != 38 )
goto LABEL_22;
if ( (v5 & 0xF) == 15 )
v5 -= 15;
else
++v5;
LABEL_21:
dword_1400030E4 = v5;
LABEL_22:
v9 = aO[v5];
if ( v9 == 42 )
{
v10 = "failed!\n";
}
else
{
if ( v9 != 35 )
{
LABEL_27:
aO[v5] = 111;
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 ( *(v2 + 65) )
*(*(v2 + 184) + 3i64) |= 1u;
return *(v2 + 48);
}
可以看到一个O数组,数组特征加代码,可以知道这是一个迷宫。那么接下来就需要把迷宫弄出来和知道对应按键就行。
****************
o.*..*......*..*
*.**...**.*.*.**
*.****.**.*.*.**
*...**....*.*.**
***..***.**.*..*
*.**.***.**.**.*
*.**.******.**.*
*.**....***.**.*
*.*****.***....*
*...***.********
**..***......#**
**.*************
****************
同时可以看到代码中有4种情况,0x17
,0x25
,0x24
,0x26
。简单查一下,驱动里边应该是指键盘的扫描码。分别代表为i
,j
,k
,l
,又分别代表上左下右。从o到#的路径则为LKKKLLKLKKKLLLKKKLLLLLL
。