buuctf-SimpleRev
1 __int64 Decry() 2 { 3 char *v0; // rax@1 4 char v2; // [sp+Fh] [bp-51h]@19 5 int v3; // [sp+10h] [bp-50h]@1 6 signed int v4; // [sp+14h] [bp-4Ch]@1 7 signed int i; // [sp+18h] [bp-48h]@1 8 signed int v6; // [sp+1Ch] [bp-44h]@1 9 char src[8]; // [sp+20h] [bp-40h]@1 10 __int64 v8; // [sp+28h] [bp-38h]@1 11 int v9; // [sp+30h] [bp-30h]@1 12 __int64 v10; // [sp+40h] [bp-20h]@1 13 __int64 v11; // [sp+48h] [bp-18h]@1 14 int v12; // [sp+50h] [bp-10h]@1 15 __int64 v13; // [sp+58h] [bp-8h]@1 16 17 v13 = *MK_FP(__FS__, 40LL); 18 *(_QWORD *)src = 357761762382LL; //选中之后H键转换16进制为0x534C43444ELL,数据在内存中是小端顺序,高位在高地址处,低位在低地址处,故实际的字符顺序应为'0x4e44434c53'经过16字符转换为ASCII码转换后字符为'NDCLS' 19 20 v8 = 0LL; 21 v9 = 0; 22 v10 = 512969957736LL; //同上,转换后查询Ascii码为"wodah" 23 v11 = 0LL; 24 v12 = 0; 25 LODWORD(v0) = join(key3, &v10); //在main页面v3='kills',v10=’wodah‘,这个函数就是把v3和v10两个字符串相拼接'killshadow' 26 text = v0; 27 strcpy(key, key1); //strcpy函数就是让key1的值('ADSFK')赋予key 28 strcat(key, src); //strcat函数就是让src的值拼接到key后面也就是'ADSFKNDCLS' 29 v3 = 0; 30 v4 = 0; 31 getchar(); //清空缓冲区 32 v6 = strlen(key); //v6的长度等于keyu,v6=10 33 for ( i = 0; i < v6; ++i ) 34 { 35 if ( key[v4 % v6] > 64 && key[v4 % v6] <= 90 ) //将大写字母转换为小写字母 36 key[i] = key[v4 % v6] + 32; //’adsfkndcls‘ 37 ++v4; 38 } 39 printf("Please input your flag:", src); 40 while ( 1 ) 41 { 42 v2 = getchar(); 43 if ( v2 == 10 ) 44 break; 45 if ( v2 == 32 ) 46 { 47 ++v3; 48 } 49 else 50 { 51 if ( v2 <= 96 || v2 > 122 ) //如果输入的v2不是小写字母 52 { 53 if ( v2 > 64 && v2 <= 90 ) //如果v2为大写字母 54 str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97; //对srt[v3]进行处理(v3为0每次加1)//// str1[v3] = (v2-key[v4]+58)%26 + 97//变换后str2[v3]存放小写字母 55 } 56 else 57 { 58 str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97; //同样处理 59 } 60 if ( !(v4 % v6) ) 61 putchar(32); 62 ++v3; 63 } 64 } 65 if ( !strcmp(text, str2) ) //如果text和存储的str2相同,就成功· 66 puts("Congratulation!\n"); //text = ""killshadow" 67 else 68 puts("Try again!\n"); 69 return *MK_FP(__FS__, 40LL) ^ v13; 70 }
分析代码以及相应的值,我们已经可以知道text以及key的值,剩下就是str2,str2就是我们想要的flag
得到flag的条件关键在于式子str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97
1 text = 'killswodah' 2 key = 'adsfkslcdn' 3 flag = '' 4 for i in range(len(key)): 5 for j in range(65,122): 6 if ord(text[i]) == (j - 39 - ord(key[i % 10]) + 97) % 26 + 97: 7 flag += chr(j) 8 break 9 print(flag)
未亡人



浙公网安备 33010602011771号