buu [羊城杯 2020]easyre1

首先用exeinfo打开,显示无壳,并且是64位的。

使用ida打开:

这题结构很清晰,就是3次加密,然后和str2比对即可。三个加密函数的参数很整齐,第一个参数是输入 第二个参数是长度 第三个参数是输出。

首先是第一次加密函数,里面alphabet数组一看,想都不用想base64.

其次是第二个加密函数,就是将加密后的52字节按照13字节一组,化成4组,打乱原来的顺序。

第三个加密函数,就是将字符串中的字母、数字,往后面移3个单位。也很简单。

附上脚本:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 第一个参数是输入  第二个参数是长度 第三个参数是输出
int  encode_three(const char *a1, int a2, char *a3, int *a4)
{
	char v5; // [rsp+Fh] [rbp-11h]
	int i; // [rsp+14h] [rbp-Ch]
	char *v7; // [rsp+18h] [rbp-8h]
	const char *v8; // [rsp+30h] [rbp+10h]
	v8 = a1;
	v7 = a3;
	for (i = 0; i < a2; ++i)
	{
		v5 = *v8;
		if (*v8 <= '@' || v5 > 'Z')
		{
			if (v5 <= '`' || v5 > 'z')
			{
				if (v5 <= '/' || v5 > '9')
					*v7 = v5;
				else
					*v7 = (v5 - 48 + 7) % 10 + 48;
			}
			else
			{
				*v7 = (v5 - 97 + 23) % 26 + 97;
			}
		}
		else
		{
			*v7 = (v5 - 65 + 23) % 26 + 65;
		}
		++v7;
		++v8;
	}
	return 0;
}
int encode_two(const char *a1, int a2, char *a3, int *a4)
{
	char *Source; // [rsp+40h] [rbp+10h]
	char *v6; // [rsp+50h] [rbp+20h]

	Source = (char *)a1;
	v6 = a3;
	if (!a1 || !a2)
		return 0xFFFFFFFFi64;
	strncpy(a3+26, a1 , 13ui64);
	strncpy(v6 , Source+13, 13ui64);
	strncpy(v6 + 39, Source + 26, 13ui64);
	strncpy(v6 + 13, Source + 39, 13ui64);
	return 0i64;
}
int main() {
	char zzq[100] = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG";
	char zzq1[100] ="BjYjM2Mjk4NzMR1dIVHs2NzJjY0MTEzM2VhMn0=zQ3NzhhMzhlOD";
	char zzq2[100] = {0};
	encode_three(zzq, 54, zzq1, NULL);
	encode_two(zzq1, 54, zzq2, NULL);

	printf("%s", zzq2);

	printf("\n");

}

得到:

base64解密即可。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值