题目信息
解题步骤
main函数 1 2 3 4 5 int __cdecl main (int argc, const char **argv, const char **envp) { return main_0(argc, argv, envp); }
先理解一下现在的代码:
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 int __cdecl main_0 (int argc, const char **argv, const char **envp) { size_t v3; const char *v4; size_t v5; char v7; char v8; signed int j; int i; signed int v11; char Destination[108 ]; char Str[28 ]; _BYTE v14[8 ]; for ( i = 0 ; i < 100 ; ++i ) { if ( (unsigned int )i >= 0x64 ) j____report_rangecheckfailure(); Destination[i] = 0 ; } sub_41132F("please enter the flag:" , v7); sub_411375("%20s" , (char )Str); v3 = j_strlen(Str); v4 = (const char *)sub_4110BE(Str, v3, v14); strncpy (Destination, v4, 0x28u ); v11 = j_strlen(Destination); for ( j = 0 ; j < v11; ++j ) Destination[j] += j; v5 = j_strlen(Destination); if ( !strncmp (Destination, Str2, v5) ) sub_41132F("rigth flag!\n" , v8); else sub_41132F("wrong flag!\n" , v8); return 0 ; }
诶,有一个陌生的函数sub_4110BE,我们跟进一下看下。
看着非常像Base64
1 Base64编码表:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
接着分析整体的内容
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 int __cdecl main_0 (int argc, const char **argv, const char **envp) { size_t v3; const char *v4; size_t v5; char v7; char v8; signed int j; int i; signed int v11; char Destination[108 ]; char Str[28 ]; _BYTE v14[8 ]; for ( i = 0 ; i < 100 ; ++i ) { if ( (unsigned int )i >= 0x64 ) j____report_rangecheckfailure(); Destination[i] = 0 ; } sub_41132F("please enter the flag:" , v7); sub_411375("%20s" , (char )Str); v3 = j_strlen(Str); v4 = (const char *)sub_4110BE(Str, v3, v14); strncpy (Destination, v4, 0x28u ); v11 = j_strlen(Destination); for ( j = 0 ; j < v11; ++j ) Destination[j] += j; v5 = j_strlen(Destination); if ( !strncmp (Destination, Str2, v5) ) sub_41132F("rigth flag!\n" , v8); else sub_41132F("wrong flag!\n" , v8); return 0 ; }
我们接下来看下Str2的内容是什么
加密过程可以总结为:
1 flag → Base64编码 → 每个字符 + 索引值 → 加密结果
graph LR;
id1([flag])-->Base64编码-->markdown[每个字符 + 索引值] --> id2([加密结果]);
因此,解密过程为:
1 加密结果 → 每个字符 - 索引值 → Base64解码 → 原始flag
graph LR;
id1([加密结果])-->markdown[每个字符 - 索引值] -->Base64解码 -->id2([原始FLAG]);
1 2 3 4 5 6 7 8 import base64encoded_str = 'e3nifIH9b_C@n@dH' decoded_chars = '' .join(chr (ord (c) - i) for i, c in enumerate (encoded_str)) flag = base64.b64decode(decoded_chars).decode('utf-8' ) print (flag)
flag{i_l0ve_you}