链接:https://pan.baidu.com/s/15ojPMVsasx3EZ9s5wVQqEw
提取码:icjp
0x01 使用EFPE查看文件

没有加壳,64位文件
0x02 使用IDA打开文件,查看main函数,F5反编译

0x03 查看 Decry()函数
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
| __int64 Decry() { char *v0; char v2; int v3; signed int v4; signed int i; signed int v6; char src[8]; __int64 v8; int v9; __int64 v10; __int64 v11; int v12; __int64 v13;
v13 = *MK_FP(__FS__, 40LL); *(_QWORD *)src = 357761762382LL; v8 = 0LL; v9 = 0; v10 = 512969957736LL; v11 = 0LL; v12 = 0; LODWORD(v0) = join(key3, &v10); text = v0; strcpy(key, key1); strcat(key, src); v3 = 0; v4 = 0; getchar(); v6 = strlen(key); for ( i = 0; i < v6; ++i ) { if ( key[v4 % v6] > 64 && key[v4 % v6] <= 90 ) key[i] = key[v4 % v6] + 32; ++v4; } printf("Please input your flag:", src); while ( 1 ) { v2 = getchar(); if ( v2 == 10 ) break; if ( v2 == 32 ) { ++v3; } else { if ( v2 <= 96 || v2 > 122 ) { if ( v2 > 64 && v2 <= 90 ) str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97; } else { str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97; } if ( !(v4 % v6) ) putchar(32); ++v3; } } if ( !strcmp(text, str2) ) puts("Congratulation!\n"); else puts("Try again!\n"); return *MK_FP(__FS__, 40LL) ^ v13; }
|
分析代码以及相应的值,我们已经可以知道text以及key的值,剩下就是str2,str2就是我们想要的flag
得到flag的条件关键在于式子str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97
0x04 构造playload爆破
1 2 3 4 5 6 7 8 9
| text = 'killswodah' key = 'adsfkslcdn' flag = '' for i in range(len(key)): for j in range(65,122): if ord(text[i]) == (j - 39 - ord(key[i % 10]) + 97) % 26 + 97: flag += chr(j) break print(flag)
|
flag{KLDQCOZFDU}