[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}