unsigned __int64 Decry() { char v1; // [rsp+Fh] [rbp-51h] int v2; // [rsp+10h] [rbp-50h] int v3; // [rsp+14h] [rbp-4Ch] int i; // [rsp+18h] [rbp-48h] int v5; // [rsp+1Ch] [rbp-44h] char src[8]; // [rsp+20h] [rbp-40h] BYREF __int64 v7; // [rsp+28h] [rbp-38h] int v8; // [rsp+30h] [rbp-30h] __int64 v9[2]; // [rsp+40h] [rbp-20h] BYREF int v10; // [rsp+50h] [rbp-10h] unsigned __int64 v11; // [rsp+58h] [rbp-8h] v11 = __readfsqword('('); *(_QWORD *)src = 'SLCDN'; v7 = 0LL; v8 = 0; v9[0] = 'wodah'; v9[1] = 0LL; v10 = 0; text = (char *)join(key3, v9); strcpy(key, key1); strcat(key, src); v2 = 0; v3 = 0; getchar(); v5 = strlen(key); for ( i = 0; i < v5; ++i ) { if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 ) key[i] = key[v3 % v5] + 32; ++v3; } printf("Please input your flag:"); while ( 1 ) { v1 = getchar(); if ( v1 == 10 ) break; if ( v1 == 32 ) { ++v2; } else { if ( v1 <= 96 || v1 > 122 ) { if ( v1 > 64 && v1 <= 90 ) { str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; ++v3; } } else { str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; ++v3; } if ( !(v3 % v5) ) putchar(32); ++v2; } } if ( !strcmp(text, str2) ) puts("Congratulation!\n"); else puts("Try again!\n"); return __readfsqword('(') ^ v11; }
时间: 2024-04-01 19:33:51 浏览: 82
这段代码是一个函数,名为 Decry(),接收无参数,返回一个 unsigned __int64 类型的值。
在函数内部,定义了一些变量,包括 char 类型的 v1、int 类型的 v2、v3、i、v5 和 v8,以及 char 类型的数组 src、str2 和 key,以及 __int64 类型的数组 v9 和变量 v7、v10 和 v11。
接下来,将 'SLCDN' 赋值给数组 src,并将 0 赋值给变量 v7 和 v10,将 'wodah' 赋值给数组 v9[0],0 赋值给数组 v9[1],将 text 指向 join(key3, v9) 的返回值,将 key1 的值复制到 key 中,将 src 拼接到 key 中。接着,获取输入并计算出 key 的长度,然后对 key 中的字符进行处理,将大写字母转换为小写字母并将其赋值给 key 中的相应位置。
然后,程序提示用户输入标志,并对用户输入的每个字符进行处理。如果字符为换行符,则退出循环;如果字符为空格,则将变量 v2 的值加 1;否则,如果字符为字母,则将其解密并存储到 str2 数组中,同时将变量 v3 的值加 1。最后,如果 v3 % v5 为 0,则输出空格。如果解密后的 str2 与 text 相等,则输出 "Congratulation!",否则输出 "Try again!"。
由于无法判断 key3 和 text 的值,因此无法对该函数进行完整的解密和分析。
相关问题
__int64 __fastcall main(int a1, char **a2, char **a3) { void *v4; // rsp unsigned int v5; // ebx char v6; // r13 char **v7; // [rsp+0h] [rbp-50h] BYREF int v8; // [rsp+Ch] [rbp-44h] unsigned int v9; // [rsp+18h] [rbp-38h] int v10; // [rsp+1Ch] [rbp-34h] __int64 v11; // [rsp+20h] [rbp-30h] char *dest; // [rsp+28h] [rbp-28h] v8 = a1; v7 = a2; if ( a1 == 2 ) { v11 = (unsigned int)n - 1LL; v4 = alloca(16 * (((unsigned __int64)(unsigned int)n + 15) / 0x10)); dest = (char *)&v7; strcpy((char *)&v7, src); v10 = 0; v9 = 0; while ( memcmp(dest, "RE19", 4uLL) ) { v5 = v9 % (unsigned int)n; v6 = dest[v9 % (unsigned int)n]; dest[v5] = sub_40060D() ^ v6; ++v9; } if ( !memcmp(dest, v7[1], (unsigned int)n) ) printf("The flag is %s\n", v7[1]); else puts("Try again"); printf("%s %d\n", dest, v9); return 0LL; } else { printf("Usage: %s <password>\n", *v7); return 1LL; } }
这是一个 C 语言程序的 main 函数汇编代码,该函数接受 3 个参数,第一个参数是整数类型,第二个和第三个参数都是指向字符指针的指针。下面是对该函数汇编代码的解释:
1. 将第一个参数 a1 保存到 v8 中。
2. 将第二个参数 a2 保存到 v7 中。
3. 如果 a1 的值等于 2,则执行以下代码块,否则打印 "Usage: %s <password>\n" 并返回 1。
4. 将 n 减 1 后的结果保存到 v11 中。
5. 为 v4 分配空间。
6. 将 dest 指向 v7 的地址。
7. 将 src 的内容复制到 v7 中。
8. 将 v10 的值设置为 0,v9 的值设置为 0。
9. 循环执行以下操作,直到 dest 中的前 4 个字符与 "RE19" 相等:
a. 将 v9 对 n 取余后的结果保存到 v5 中。
b. 将 dest 中 v9 对 n 取余后的位置的值保存到 v6 中。
c. 将 sub_40060D() 的返回值与 v6 做异或运算后保存到 dest 中 v9 对 n 取余后的位置。
d. 将 v9 加 1。
10. 如果 dest 中的值与 v7[1] 相等,则打印 "The flag is %s\n" 并返回 0,否则打印 "Try again" 并返回 0。
11. 打印 dest 和 v9 的值。
12. 返回 0。
需要注意的是,由于该函数是汇编代码,缺少了函数声明和其他必要的上下文,因此无法判断该函数的实际作用和调用方式。
int __cdecl translate(char *a1) { size_t v1; // edx unsigned __int8 *v2; // eax int result; // eax while ( 1 ) { result = (unsigned __int8)*a1; if ( !(_BYTE)result ) break; v1 = index_(origin_table, *a1); v2 = (unsigned __int8 *)a1++; *v2 = note_table[v1]; } return result; }
这是一个使用 C 语言编写的函数,函数名为 "translate"。该函数接受一个指向字符数组的指针 "a1"。函数的作用是将 "a1" 指向的字符串进行转换,具体的转换规则使用了两个全局变量 "origin_table" 和 "note_table"。
函数中使用了一个 while 循环,循环条件为永远为真,所以需要在循环内部使用 break 语句来跳出循环。在循环内部,首先将当前字符转换为 unsigned __int8 类型的整数,将其赋值给变量 result。如果 result 等于 0,也就是当前字符为字符串的结束符 '\0',则跳出循环,否则执行下一步。
函数中使用了一个自定义函数 index_,该函数用于查找 "origin_table" 中某个字符的位置,并返回该位置的下标。v1 变量用于保存该下标值。
接下来,使用指针 "v2" 将当前字符的地址保存下来,并将该字符转换为 "note_table" 中对应位置的字符,重新赋值给该字符的地址。循环会不断执行,直到遇到字符串的结束符为止。
最后,函数返回变量 result,实际上返回的是字符串的结束符 '\0' 的 ASCII 码值。
阅读全文