[NPUCTF2020]Baby Obfuscation

无壳,载入 IDA,查看主函数

首先是几个名字随便函数:F0X1 ~ F0X5

F0X1 是求 gcd

F0X2 & F0X3 为一个布尔类型,返回值为 1 需要传入的两个参数均为 true

F0X4 实质上是 a - b

F0X5 求的是 a 的 b 次方

大体分析一下,即为

可以发现主要的运算过程有三个:

  1. A0X1[i_0] = user_input[i_0 - 1] - A0X4[(i_0 - 1) % 4]

  2. A0X1[i_0] ^= A0X4[(i_0 - 1) % 4]

  3. 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}

posted @ 2022-06-02 16:23  Moominn  阅读(99)  评论(0编辑  收藏  举报