[ACTF新生赛2020]SoulLike-BUUCTF

一道 x64 的 elf 逆向,载入 IDA,查看主函数

前面部分逻辑比较简单,看到重点在于 sub_83A 这个函数,试图反编译发现函数太大了,这里需要将 ida/ctg 目录下的 hexrays.cfg 文件中的 MAX_FUNCSIZE=64 改为 1024,改后就可以成功反编译了

经过漫长的等待,结果如下

这个函数竟然进行了整整三千多行异或操作,最后将操作后的 a1 数组与 v3 数组作比较,也就是说操作前的 a1 就是我们的 flag

这里可以直接进行爆破,网上的 wp 都是用的 pwntools,不会用,这里提供一个简单粗暴的 c艹 的 exp

#include <bits/stdc++.h>
using namespace std;
int v3[] = {126, 50, 37, 88, 89, 107, 53, 110, 0, 19, 30, 56};
int a1[20], flag[20];
inline void sub_83A(int *a1) {
  *a1 ^= 0x2Bu;
  a1[1] ^= 0x6Cu;
  a1[2] ^= 0x7Eu;
  a1[3] ^= 0x56u;
  a1[4] ^= 0x39u;
  a1[5] ^= 3u;
  a1[6] ^= 0x2Du;
  a1[7] ^= 0x28u;
  a1[8] ^= 8u;
  ++a1[9];
......    //太长了这里就不放了,其实就是把IDA里的异或部分全部复制粘贴下来
}
int main() {
  for (int i = 0; i < 12; i++) {
  	for (int j = 0; j <= 126; j++) {
      for (int k = 0; k < i; k++) a1[k] = flag[k];
      a1[i] = j;
      sub_83A(a1);
      if (a1[i] == v3[i]) {
      	flag[i] = j;
      	break;
      }
    }
  }
  for (int i = 0; i < 12; i++) cout << (char)flag[i];  
  return 0;
}

运行得到 flag

flag{b0Nf|Re_LiT!}

posted @ 2021-11-05 19:40  Moominn  阅读(388)  评论(0编辑  收藏  举报