1. 程式人生 > 實用技巧 >BUUCTF逆向刷題——[GKCTF2020]BabyDriver

BUUCTF逆向刷題——[GKCTF2020]BabyDriver

IDA開啟在這裡插入圖片描述
在sub_140001380發現主函式
然後在字串裡發現有東西
在這裡插入圖片描述
雙擊跟進
在這裡插入圖片描述發現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一行的。然後開始分段
在這裡插入圖片描述
O應該是起點,#應該是終點。
有了迷宮了,就差上下左右走的條件了,這裡我看了好長時間沒看出來

,看了別人的wp才知道這裡由於是sys檔案,是由鍵盤過濾驅動獲取鍵盤掃描碼來控制上下左右,而不是ascll碼

第一次知道在這裡插入圖片描述
在這裡插入圖片描述
解出路徑為LKKKLLKLKKKLLLKKKLLLLLL。
題裡面又提示flag是其路徑的md5的32位小寫,故得到flag:

flag{403950a6f64f7fc4b655dea696997851}