文件有壳 先用upx脱壳 upx -d 文件地址
将文件拖入IDA shift+F12查看可疑字符串
先进入主函数查看
继续跟进function函数 发现这就是一个base64解码
void __cdecl func(char *x, char *y)
{
unsigned __int8 *v3; // 用于暂存字符的指针
unsigned __int8 v4; // 用于暂存单个字符
int v5; // 用于临时存储计算结果
int v6; // 用于临时存储计算结果
int v7; // 用于临时存储计算结果
int v8; // 用于临时存储计算结果
int v9; // 用于临时存储计算结果
int v10; // 用于临时存储计算结果
unsigned __int8 a4[4]; // 存储Base64编码后的字符
unsigned __int8 a3[3]; // 用于暂存需要编码的3个字符
char b[65]; // Base64编码所需的字符集
int k; // 循环计数变量
int j; // 循环计数变量
int i; // 循环计数变量
int len; // 输入字符串的长度
int index; // 输出字符串的索引
char *xa; // 指向输入字符串的指针
xa = x;
index = 0;
len = strlen(x);
i = 0;
j = 0;
k = 0;
// Base64编码所需的字符集
strcpy(b, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
while (len--)
{
v3 = (unsigned __int8 *)xa++;
v4 = *v3;
LODWORD(v3) = i++;
a3[(int)v3] = v4;
if (i == 3)
{
// 对三个字符进行Base64编码
a4[0] = a3[0] >> 2;
a4[1] = ((16 * a3[0]) & 0x30) + (a3[1] >> 4);
a4[2] = ((4 * a3[1]) & 0x3C) + (a3[2] >> 6);
a4[3] = a3[2] & 0x3F;
// 将编码后的字符存储在输出字符串中
for (i = 0; i <= 3; ++i)
{
v5 = a4[i];
v6 = index++;
y[v6] = b[v5];
}
i = 0;
}
}
if (i)
{
for (j = i; j <= 2; ++j)
a3[j] = 0;
// 对剩余字符进行Base64编码
a4[0] = a3[0] >> 2;
a4[1] = ((16 * a3[0]) & 0x30) + (a3[1] >> 4);
a4[2] = ((4 * a3[1]) & 0x3C) + (a3[2] >> 6);
a4[3] = a3[2] & 0x3F;
// 将编码后的字符存储在输出字符串中
for (j = 0; i >= j; ++j)
{
v7 = a4[j];
v8 = index++;
y[v8] = b[v7];
}
// 添加Base64填充字符
while (1)
{
v9 = i++;
if (v9 > 2)
break;
v10 = index++;
y[v10] = 61; // '='
}
}
y[index] = 0; // 结束字符串
}
对字符串进行base64解码
得到flag
NSSCTF{Y0u_h@v2_/\/\@57er3d_7he_r3v3rs3}