IDA打开题目
大致看主函数没什么东西,重要控制开始和退出,我们进入decry加密函数看看,下面给出ai解释后的伪代码方便理解
点击查察代码[code]// 解密验证函数,返回栈保护校验值unsigned __int64 Decry(){ // 局部变量声明(IDA自动生成的变量名) char v1; // 临时存储输入的字符 [rsp+Fh] [rbp-51h] int v2; // 输入字符索引(str2的位置)[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] __int64 v7; // 填充对齐 [rsp+28h] [rbp-38h] int v8; // 填充对齐 [rsp+30h] [rbp-30h] __int64 v9[2]; // 关键字符串存储 [rsp+40h] [rbp-20h] int v10; // 填充对齐 [rsp+50h] [rbp-10h] unsigned __int64 v11; // 栈保护金丝雀值 [rsp+58h] [rbp-8h] // 初始化栈保护机制 v11 = __readfsqword(0x28u); /*------------------------ 初始化关键数据 ------------------------*/ // src 初始化为小端序数据:0x534C43444E -> "NLCKS" (注意小端存储实际为 4E 44 43 4C 53) *(_QWORD *)src = 0x534C43444ELL; // 等价于 strcpy(src, "NLCKS") v7 = 0LL; // 填充清零 v8 = 0; // 填充清零 // v9 初始化为小端序数据:0x776F646168 -> "hadow" (注意小端存储) v9[0] = 0x776F646168LL; // 实际存储为 68 64 6F 77 -> "hdo w"(需联合后续代码分析) v9[1] = 0LL; // 字符串停止符 v10 = 0; // 填充清零 // 拼接关键字符串:text = key3 + v9(例如 key3="flag{",v9="shadow" → text="flag{shadow}") text = (char *)join(key3, v9); // 假设 join 是字符串毗连函数 /*------------------------ 构建加密密钥 ------------------------*/ strcpy(key, key1); // 初始化密钥基础部分(假设 key1 是预设字符串) strcat(key, src); // 拼接密钥扩展部分(key = key1 + "NLCKS") v2 = 0; // 初始化输入索引 v3 = 0; // 初始化密钥索引 getchar(); // 清除输入缓冲区残留字符 /*------------------------ 预处理密钥 ------------------------*/ v5 = strlen(key); // 获取密钥长度 for (i = 0; i < v5; ++i) { // 将密钥中的大写字母(A-Z)转换为小写 if (key[v3 % v5] > 64 && key[v3 % v5] 64 && v1 =65 and ord(keylist) |