一.查壳

64位无壳

二.主函数逻辑

可以得知flag长度为38,然后进行三次加密

第一次加密是base64加密,得到code1

第二次加密是将code1拆成四段赋给code2

第三次加密是将code2内的数字和字母移3位,其他字符不变

str2保存的是最终的加密字符

三.encode_one_base64

看到主函数的str2大概就可以猜到是base64,ctrl+f12也可以看到存在base64表

进入该函数后大概看一下不难发现是base64加密并且这题没有换表操作

四.encode_two

拆分赋值

 

五.encode_three

对数字和字母移三位,其他特殊字符不变,要求出加密前的字符串,只需要对数字+7再mod10,对字母+23再mod26,有点补码的感觉在

六.解题脚本

#include <stdio.h>
int main()
{
	char str[53] = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG";
	char code2[53] = { 0 };
	char code1[53] = { 0 };
	int len = 52;
	for (int i = 0; i < len; i++)//求解code2
	{
		if (str[i] < 'A' || str[i]>'Z')
		{
			if (str[i] < 'a' || str[i]>'z')
			{
				if (str[i] < '0' || str[i]>'9')
					code2[i] = str[i];
				else
					code2[i] = (str[i] - 48 + 7) % 10 + 48;
			}
			else
			{
				code2[i] = (str[i] - 97 + 23) % 26 + 97;
			}
		}
		else
		{
			code2[i] = (str[i] - 65 + 23) % 26 + 65;
		}
	}
	strncpy(code1 + 26, code2, 13u);          //求解code1,调换一下顺序即可
	strncpy(code1, code2 + 13, 13u);
	strncpy(code1 + 39, code2 + 26, 13u);
	strncpy(code1 + 13, code2 + 39, 13u );
	puts(code1);//打印code1
	//R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0=
	return 0;
}

得到R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0=

base64解密后得到:GWHT{672cc4778a38e80cb362987341133ea2}

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐