[MRCTF2020]EasyCpp

载入 IDA,查看主函数

直接看一下操作部分,首先是一个 lambda 函数,跟进去发现是一个与 1 异或

接下来就是遍历 vecotr,首先会先进入一个 depart 函数

也就是一个递归进行分解质因数,然后将分解出来的质因数以空格间隔并以字符串的方式存储

depart 函数过后紧跟一个 lambda,跟进去看一眼发现主要是进行了一个替换的工作

替换结束后会进入下一个函数与全局变量 ans 进行比对,可以通过交叉引用找到赋值函数

总的逻辑即为:输入内容与 1 异或,进入 depart 函数分解成由质因数组成的字符串,通过替换函数形成最终结果与 ans 比对。然后根据这个思路写脚本逆向即可,exp 如下

#include <bits/stdc++.h>
using namespace std;
string s[10];
inline void init() {
  s[0] = "=zqE=z=z=z";
  s[1] = "=lzzE";
  s[2] = "=ll=T=s=s=E";
  s[3] = "=zATT";
  s[4] = "=s=s=s=E=E=E";
  s[5] = "=EOll=E";
  s[6] = "=lE=T=E=E=E";
  s[7] = "=EsE=s=z";
  s[8] = "=AT=lE=ll";
}
inline string change(string ss) {
  int len = ss.length();
  string str;
  for (int i = 0; i < len; i++) {
    if (ss[i] == 'O') str += '0';
    if (ss[i] == 'l') str += '1';
    if (ss[i] == 'z') str += '2';
    if (ss[i] == 'E') str += '3';
    if (ss[i] == 'A') str += '4';
    if (ss[i] == 's') str += '5';
    if (ss[i] == 'G') str += '6';
    if (ss[i] == 'T') str += '7';
    if (ss[i] == 'B') str += '8';
    if (ss[i] == 'q') str += '9';
    if (ss[i] == '=') str += ' ';
  }
  return str;
} 
int main() {
  init();
  for (int i = 0; i < 9; i++) {
    int num = 0, sum = 1, len = s[i].length();
    s[i] = change(s[i]);
    for (int j = 1; j < len; j++) {
      if (s[i][j] == ' ') {
        sum *= num;
        num = 0;
        continue;
      }
      num = num * 10 + s[i][j] - '0';
    }
    sum *= num;
    sum = sum ^ 1;
    cout << sum;
  }
  return 0;
}

得到:234512225774247633749032245635316720,MD5 加密一下得到 flag

flag{4367FB5F42C6E46B2AF79BF409FB84D3}

posted @ 2022-05-26 22:50  Moominn  阅读(140)  评论(0编辑  收藏  举报