tsx81429 发表于 2025-3-17 15:38:02

SimpleRev(buu-reverse)

IDA打开题目
https://img2024.cnblogs.com/blog/3518346/202503/3518346-20250317141609685-1462988177.png
大致看主函数没什么东西,重要控制开始和退出,我们进入decry加密函数看看,下面给出ai解释后的伪代码方便理解
点击查察代码// 解密验证函数,返回栈保护校验值unsigned __int64 Decry(){// 局部变量声明(IDA自动生成的变量名)char v1;            // 临时存储输入的字符 int v2;               // 输入字符索引(str2的位置) int v3;               // 密钥轮转索引 int i;                // 循环计数器 int v5;               // 密钥长度 char src;          // 密钥扩展缓冲区 __int64 v7;         // 填充对齐 int v8;               // 填充对齐 __int64 v9;      // 关键字符串存储 int v10;            // 填充对齐 unsigned __int64 v11; // 栈保护金丝雀值 // 初始化栈保护机制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 = 0x776F646168LL; // 实际存储为 68 64 6F 77 -> "hdo w"(需联合后续代码分析)v9 = 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 > 64 && key64 && v1 =65 and ord(keylist)
页: [1]
查看完整版本: SimpleRev(buu-reverse)