SimpleRev(buu-reverse)

打印 上一主题 下一主题

主题 998|帖子 998|积分 2994

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)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表