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