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; __int64 v4; int v5; __int16 *v6; __int64 v7; __int16 v8; char v9; const CHAR *v10;
if ( *(int *)(a2 + 48) >= 0 ) { v3 = *(_QWORD *)(a2 + 24); v4 = *(_QWORD *)(a2 + 56) >> 3; if ( (_DWORD)v4 ) { v5 = dword_1400030E4; 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 ) { if ( (v5 & 0xFFFFFFF0) != 0 ) { 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) != 0 ) { --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 == '*' ) { v10 = "failed!\n"; } else { if ( v9 != 35 ) { LABEL_27: aO[v5] = '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}