main()
如下:
int __cdecl main(int argc, const char **argv, const char **envp) { char s[240]; // [rsp+0h] [rbp-1E0h] BYREF char v5[240]; // [rsp+F0h] [rbp-F0h] BYREF memset(s, 0, 0x1EuLL); printf("Please Input Key: "); __isoc99_scanf("%s", v5); encode(v5, (__int64)s); if ( strlen(v5) == key ) { if ( !strcmp(s, enflag) ) puts("You are Right"); else puts("flag{This_1s_f4cker_flag}"); } return 0; }
分析得到几个关键信息:
- 对输入的内容放入
encode()
函数中进行处理。 - 输入的内容长度要等于
key
。 - 把加密后的字符与enflag相比较,相等即可。
enflag
的值为izwhroz””w”v.K”.Ni,同时也可以得知key
的长度为0x12。
encode()
:
int __fastcall encode(const char *a1, __int64 a2) { char v3[104]; // [rsp+10h] [rbp-70h] int v4; // [rsp+78h] [rbp-8h] int i; // [rsp+7Ch] [rbp-4h] i = 0; v4 = 0; if ( strlen(a1) != key ) return puts("Your Length is Wrong"); for ( i = 0; i < key; i += 3 ) { v3[i + 64] = key ^ (a1[i] + 6); v3[i + 33] = (a1[i + 1] - 6) ^ key; v3[i + 2] = a1[i + 2] ^ 6 ^ key; *(_BYTE *)(a2 + i) = v3[i + 64]; *(_BYTE *)(a2 + i + 1LL) = v3[i + 33]; *(_BYTE *)(a2 + i + 2LL) = v3[i + 2]; } return a2; }
加密程序是将字符串三位一组进行相关的加减异或运算。现在已知enflag和key,按逻辑编写解密脚本即可。
enflag = [105,122,119,104,114,111,122,34,34,119,34,118,46,75,34,46,78,105] key = 0x12 flag = '' for i in range(0,key,3): flag += chr((key ^ enflag[i])-6) flag += chr((enflag[i+1] ^ key) +6) flag += chr(enflag[i+2] ^ key ^ 6) print(flag)
解得:unctf{b66_6b6_66b}