首先用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解密即可。