BUUCTF [羊城杯 2020]easyre 题解
对数字和字母移三位,其他特殊字符不变,要求出加密前的字符串,只需要对数字+7再mod10,对字母+23再mod26,有点补码的感觉在。看到主函数的str2大概就可以猜到是base64,ctrl+f12也可以看到存在base64表。进入该函数后大概看一下不难发现是base64加密并且这题没有换表操作。第三次加密是将code2内的数字和字母移3位,其他字符不变。第一次加密是base64加密,得到cod
·
一.查壳
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}
更多推荐
已为社区贡献1条内容
所有评论(0)