1.准備

恩...毫無信息,用萬能的IDA打開,博客園居然502了...
2.IDA打開
反編譯main函數,獲得C代碼
1 int __cdecl main(int argc, const char **argv, const char **envp) 2 { 3 char *v3; // rsi 4 int result; // eax 5 signed int i; // [rsp+2Ch] [rbp-124h] 6 char v6[264]; // [rsp+40h] [rbp-110h] 7 __int64 v7; // [rsp+148h] [rbp-8h] 8 9 memset(v6, 0, 0x100uLL); 10 v3 = (char *)256; 11 printf("Input your flag:\n", 0LL); 12 get_line(v6, 256LL); 13 if ( strlen(v6) != 33 ) 14 goto LABEL_12; 15 for ( i = 1; i < 33; ++i ) 16 v6[i] ^= v6[i - 1]; 17 v3 = global; 18 if ( !strncmp(v6, global, 0x21uLL) ) 19 printf("Success", v3); 20 else 21 LABEL_12: 22 printf("Failed", v3); 23 result = __stack_chk_guard; 24 if ( __stack_chk_guard == v7 ) 25 result = 0; 26 return result; 27 }
2.1代碼分析
從第13行代碼,我們知道flag的長度是33
第18行代碼,在比較v6和global,后面的0x21也印證了,flag長度是33
global
__cstring:0000000100000F6E aFKWOXZUPFVMDGH db 'f',0Ah ; DATA XREF: __data:_global↓o __cstring:0000000100000F6E db 'k',0Ch,'w&O.@',11h,'x',0Dh,'Z;U',11h,'p',19h,'F',1Fh,'v"M#D',0Eh,'g' __cstring:0000000100000F6E db 6,'h',0Fh,'G2O',0
從第15~16行代碼,我們知道了v6的處理方式,那么將global反過來處理,也就獲得了flag。
2.2腳本獲取flag
str1 = ['f', 0x0A, 'k', 0x0C, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v', '"', 'M', '#', 'D', 0x0E, 'g', 6, 'h', 0x0F, 'G', '2', 'O'] x = 'f' for i in range(1, len(str1)): if (isinstance(str1[i], str)): if (isinstance(str1[i - 1], str)): x += chr(ord(str1[i]) ^ ord(str1[i - 1])) else: x += chr(ord(str1[i]) ^ str1[i - 1]) else: x += chr(str1[i] ^ ord(str1[i - 1])) print(x)
注:第一個‘f’沒有被處理,但是也是flag的一部分。
3.get flag!
flag{QianQiuWanDai_YiTongJiangHu}
