载入 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}