[NPUCTF2020]Baby Obfuscation
无壳,载入 IDA,查看主函数
首先是几个名字随便函数:F0X1 ~ F0X5
F0X1 是求 gcd
F0X2 & F0X3 为一个布尔类型,返回值为 1 需要传入的两个参数均为 true
F0X4 实质上是 a - b
F0X5 求的是 a 的 b 次方
大体分析一下,即为
可以发现主要的运算过程有三个:
-
A0X1[i_0] = user_input[i_0 - 1] - A0X4[(i_0 - 1) % 4]
-
A0X1[i_0] ^= A0X4[(i_0 - 1) % 4]
-
A0X1[i_0] *= 10
然后在比较环节会再乘个 10,A0X6 已知
逆向得:
#include <bits/stdc++.h>
using namespace std;
int A0X6[20] = {0x0, 0x1e79, 0x1e79, 0x2135, 0x170d, 0x1f41, 0x1901, 0x2ced, 0x11f9, 0x2649, 0x2581, 0x2db5, 0x14b5, 0x25e5, 0x2a31, 0x30d5, 0x0};
int A0X4[5] = {2, 3, 4, 5};
char A0X1[20];
int main() {
for (int i = 1; i < 16; i++) {
A0X6[i] /= 100;
A0X6[i] ^= A0X4[(i - 1) % 4];
A0X6[i] += A0X4[(i - 1) % 4];
A0X1[i] = (char)A0X6[i];
}
for (int i = 1; i < 16; i++) cout << A0X1[i];
return 0;
}
//NPUCTF{0bfu5er}
flag: flag{0bfu5er}