BUUCTF-[ACTF新生赛2020]SoulLike
[ACTF新生赛2020]SoulLike
查壳,64位无壳
主函数看起来很简单,然后主要逻辑是下面这个sub_5E8172C0083A函数,本来不叫这个的,动调了之后变了
然后打开发现,无法看到伪代码,这里参考了这个师傅的文章[BUUCTF ACTF新生赛2020]SoulLike题解(非爆破) - Carykd - 博客园,修改ida设置
在ida目录的cfg目录下面找到hexrays.cfg,找打这个MAX_FUNSIZE,改成1024,分析不出来的原因应该是函数太长了,看了汇编代码,里面一大串东西
然后就能看见伪代码了,代码很长,3000多行,然后前面是对输入的flag进行加密,最后和v3密文进行比较
这题看见了两种做法,一种是直接爆破,还有一种是逆向这3000多行代码。。。个人感觉这题还是爆破比较合理,而且只要爆破对了,就能和下面的密文一一对应,速度还是很快的。而且哪位有错,还会告诉你哪一位错了。
看了他们的wp用了pwntool库爆破,对付这种elf文件还是比较方便的。但是不会啊,尝试用c语言来写
#include<stdio.h>
int a1[12];
int v3[] = { 126,50,37,88,89,107,53,110,0,19,30,56 };
int flag[12] = {0};
void encrypt(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];a1[10] ^= 0x2Fu;a1[11] ^= 0xAu;++* a1;a1[1] ^= 0xDu;a1[2] ^= 0x73u;a1[3] ^= a1[2];a1[4] ^= 0x37u;++a1[5];a1[6] ^= 0x69u;a1[7] ^= 0x59u;a1[8] ^= 0xCu;a1[9] ^= 0x70u;++a1[10];a1[11] ^= 0x1Fu;++* a1;a1[1] ^= 0x55u;a1[2] ^= a1[1];a1[3] ^= 0x72u;a1[4] ^= 0x1Fu;++a1[5];a1[6] ^= 0x6Du;a1[7] ^= a1[6];a1[8] ^= a1[7];a1[9] ^= 0x6Du;++a1[10];++a1[11];++* a1;a1[1] ^= 0x76u;a1[2] ^= 0x49u;a1[3] ^= 0x29u;a1[4] ^= 0x17u;a1[5] ^= 0x78u;a1[6] ^= 0x6Eu;a1[7] ^= a1[2];a1[8] ^= 0x2Cu;a1[9] ^= 0xEu;a1[10] ^= 0x1Eu;a1[11] ^= 0x52u;*a1 ^= 0x16u;a1[1] ^= 0x22u;a1[2] ^= a1[1];a1[3] ^= *a1;a1[4] ^= 0x72u;a1[5] ^= 0xCu;a1[6] ^= a1[4];a1[7] ^= 0x5Du;a1[8] ^= 0x47u;++a1[9];a1[10] ^= 0x6Eu;a1[11] ^= a1[5];*a1 ^= 0x73u;++a1[1];a1[2] ^= 0x75u;a1[3] ^= 7u;a1[4] ^= 0x68u;++a1[5];a1[6] ^= 0x41u;a1[7] ^= 0x10u;a1[8] ^= 0x3Bu;a1[9] ^= 0x2Bu;a1[10] ^= 0x65u;++a1[11];}//这里只贴出来了部分加密内容int main()
{for (int j = 0; j < 12; j++) {for (int i = 32; i < 127; i++){for (int k = 0; k < i; k++) a1[k] = flag[k];a1[j] = i;encrypt(a1);if (a1[j] == v3[j]){flag[j] = i;break;}}}for (int j = 0; j < 12; j++)printf("%c",flag[j]);
}