zoukankan      html  css  js  c++  java
  • [BUUCTF]REVERSE——刮开有奖

    刮开有奖

    附件

    步骤:

    1. 例行检查,无壳,32位程序
      在这里插入图片描述
    2. 32位ida载入,shift+f12检索程序里的字符串,看到了一个base64加密的特征字符串,猜想这题用到了base64加密
      在这里插入图片描述
    3. 从main函数开始看程序
      在这里插入图片描述
      DialogBoxParam函数百度后得知是根据对话框模板资源创建一个模态的对话框,直接看函数主体
      if ( a2 == 272 )
        return 1;
      if ( a2 != 273 )
        return 0;
      if ( (_WORD)a3 == 1001 )                      // a3=1001
      {
        memset(&String, 0, 0xFFFFu);                // memset函数将string初始化置0
        GetDlgItemTextA(hDlg, 1000, &String, 0xFFFF);
        if ( strlen(&String) == 8 )                 // string的长度为8
        {
          v7 = 90;
          v8 = 74;
          v9 = 83;
          v10 = 69;
          v11 = 67;
          v12 = 97;
          v13 = 78;
          v14 = 72;
          v15 = 51;
          v16 = 110;
          v17 = 103;
          sub_4010F0((int)&v7, 0, 10);              // sub_4010F0是一个排序 升序的算法 ,
                                                    // 对v7数组进行处理后,v7的数据是
                                                    // 51  67  69  72  74  78  83  90  97  103  110
                                                    // 
          memset(&v26, 0, 0xFFFFu);
          v26 = string[5];
          v28 = string[7];
          v27 = string[6];
          v4 = sub_401000((int)&v26, strlen(&v26)); // sub_401000是base64加密算法,对v26进行了base64加密后复制给v4
          memset(&v26, 0, 0xFFFFu);                 // v26清0
          v27 = string[3];
          v26 = string[2];
          v28 = string[4];
          v5 = sub_401000((int)&v26, strlen(&v26));
          if ( String == v7 + 34                    // string[0]='U'
            && string[1] == v11                     // string[1]='J'
            && 4 * string[2] - 141 == 3 * v9        // string[2]='W'
            && string[3] / 4 == 2 * (v14 / 9)       // string[3]='P'
            && !strcmp(v4, "ak1w")                  // V4=ak1w
            && !strcmp(
                  v5,
                  "V1Ax") )
          {                                         // v5=V1Ax
            MessageBoxA(hDlg, "U g3t 1T!", "@_@", 0);
          }
        }
        return 0;
      }
      if ( (_WORD)a3 != 1 && (_WORD)a3 != 2 )
        return 0;
      EndDialog(hDlg, (unsigned __int16)a3);
      return 1;
    }
    

    代码的大部分分析都写在注释里了,剩下的就是两个base64解密,用python3自带的base64库解密一下
    在这里插入图片描述
    根据这段代码,将string字符串理一下得到flag
    在这里插入图片描述
    flag{UJWP1jMp}

  • 相关阅读:
    前端要懂的视频知识DASH协议(建议收藏)
    HTML5 video标签播放视频下载原理
    dash视频服务器本地搭建 (初探)
    纵论WebAssembly,JS在性能逆境下召唤强援
    详解volatile在C++中的作用
    C++ lambda表达式
    Java 从入门到进阶之路(十七)
    Java 从入门到进阶之路(十六)
    Java 从入门到进阶之路(十五)
    Java 从入门到进阶之路(十四)
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273683.html
Copyright © 2011-2022 走看看