文件无壳 拖入IDA中
shift+F12查看可疑字符串 发现两串字符串 一看这两个等于号就猜测是base64编码
进入主函数看看
这段代码是一个简单的 C 语言程序,主要功能是接受用户输入的字符串作为“flag”,然后通过对输入的字符串进行一些处理和比较来验证是否输入了正确的“flag”。
继续跟进sub_401770函数
这段代码是一个 Base64 编码函数,用于将输入的字符串进行 Base64 编码处理。下面是代码的主要逻辑:
- 计算输入字符串的长度:
v6 = strlen(a1);
。 - 根据输入字符串长度取模3,得到余数
v7
。 - 根据余数的不同情况,计算 Base64 编码后的字符数组长度
v8
。 - 根据长度分配内存,并将分配的内存初始化为0。
- 将输入的字符串按照 Base64 编码规则转换为对应的 Base64 字符。
- 处理剩余字节,补充等号。
- 将处理后的 Base64 编码后的字符数组地址赋值给
a2
。 - 返回结果。
__int64 __fastcall sub_401570(const char *a1, _QWORD *a2, int *a3)
{
int v6; // r15d
int v7; // r12d
int v8; // r13d
__int64 v9; // r14
_BYTE *v10; // rax
_BYTE *v11; // r9
__int64 v12; // r8
char v13; // cl
char v14; // r11
char v15; // r10
__int64 result; // rax
v6 = strlen(a1); // 计算输入字符串的长度
v7 = v6 % 3;
if ( v6 % 3 )
{
v8 = 4 * (v6 / 3) + 4;
v9 = v8;
v10 = malloc(v8 + 1i64);
v10[v8] = 0;
if ( v6 <= 0 )
goto LABEL_5;
}
else
{
v8 = 4 * (v6 / 3);
v9 = v8;
v10 = malloc(v8 + 1i64);
v10[v8] = 0;
if ( v6 <= 0 )
goto LABEL_8;
}
v11 = v10;
v12 = 0i64;
do
{
v11 += 4;
v13 = a1[v12];
*(v11 - 4) = aQvejafhmuyjbac[v13 >> 2];
v14 = a1[v12 + 1];
*(v11 - 3) = aQvejafhmuyjbac[(v14 >> 4) | (16 * v13) & 0x30];
v15 = a1[v12 + 2];
v12 += 3i64;
*(v11 - 2) = aQvejafhmuyjbac[(v15 >> 6) | (4 * v14) & 0x3C];
*(v11 - 1) = aQvejafhmuyjbac[v15 & 0x3F];
}
while ( v6 > (int)v12 );
LABEL_5:
if ( v7 == 1 )
{
v10[v9 - 2] = 61;
v10[v9 - 1] = 61;
}
else if ( v7 == 2 )
{
v10[v9 - 1] = 61;
}
LABEL_8:
*a2 = v10;
result = 0i64;
*a3 = v8;
return result;
}
简而言之 这是一个简单的变种base64编码
写出脚本
import base64
# Base64 编码的字符串
str1 = "5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8=="
str2 = "qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD"
str3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
a = str.maketrans(str2, str3)
b = str1.translate(a)
# 解码 Base64 编码的字符串并打印结果
decoded_text = base64.b64decode(b).decode('utf-8')
print(decoded_text)
得到flag
NSSCTF{a8d4347722800e72e34e1aba3fe914ae}