BUUCTF逆向刷题——[GKCTF2020]BabyDriver

IDA打开BUUCTF逆向刷题——[GKCTF2020]BabyDriver
在sub_140001380发现主函数
然后在字符串里发现有东西
BUUCTF逆向刷题——[GKCTF2020]BabyDriver
双击跟进
BUUCTF逆向刷题——[GKCTF2020]BabyDriver发现a0有东西,估计是个迷宫题。
看代码
` char v9; // dl
CHAR *v10; // rcx

v2 = a2;
if ( *(_DWORD *)(a2 + ‘0’) >= 0 )
{
v3 = *(_QWORD *)(a2 + 24);
v4 = *(_QWORD *)(a2 + 56) >> 3;
if ( (_DWORD)v4 )
{
v5 = dword_1400030E4; // v5=10h
v6 = (__int16 *)(v3 + 2);
v7 = (unsigned int)v4;
while ( *(_WORD *)(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 += ‘�’;
dword_1400030E4 = v5;
}
if ( v8 == 37 )
{
if ( (v5 & 0xFFFFFFF0) != ‘�’ )
{
v5 += 16;
goto LABEL_21;
}
v5 -= 208;
dword_1400030E4 = v5;
}
if ( v8 == ‘$’ )
{
if ( v5 & 0xF )
{
–v5;
goto LABEL_21;
}
v5 += 15;
dword_1400030E4 = v5;
}
if ( v8 != ‘&’ )
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 ( *(_BYTE *)(v2 + 65) )
*(_BYTE )((_QWORD *)(v2 + 184) + 3i64) |= 1u;
return *(unsigned int *)(v2 + 48);
}`
是16一行的。然后开始分段
BUUCTF逆向刷题——[GKCTF2020]BabyDriver
O应该是起点,#应该是终点。
有了迷宫了,就差上下左右走的条件了,这里我看了好长时间没看出来

,看了别人的wp才知道这里由于是sys文件,是由键盘过滤驱动获取键盘扫描码来控制上下左右,而不是ascll码

第一次知道BUUCTF逆向刷题——[GKCTF2020]BabyDriver
BUUCTF逆向刷题——[GKCTF2020]BabyDriver
解出路径为LKKKLLKLKKKLLLKKKLLLLLL。
题里面又提示flag是其路径的md5的32位小写,故得到flag:

flag{403950a6f64f7fc4b655dea696997851}