BUUCTF-RE-[ACTF新生赛2020]usualCrypt
又他妈的是新生赛,我都不是新生了还天天被折磨。
首先查壳分析,然后反编译程序,可以看到程序逻辑还是比较简单的
我们进行一下整理和重命名,可以得到完整的程序逻辑:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // esi
char v5[15]; // [esp+8h] [ebp-74h] BYREF
char v6[100]; // [esp+18h] [ebp-64h] BYREF
printf(&unk_40E140);
scanf("%s", v6);
memset(v5, 0, sizeof(v5));
base_64(v6, strlen(v6), v5);
v3 = 0;
while ( v5[v3] == byte_40E0E4[v3] )
{
if ( ++v3 > strlen(v5) )
goto LABEL_6;
}
printf(aError);
LABEL_6:
if ( v3 - 1 == strlen(byte_40E0E4) )
return printf(aAreYouHappyYes);
else
return printf(aAreYouHappyNo);
}
大概就是读取一个我们的输入,然后将其进行base64
转换(为什么是Base64的转换,因为我用AI搜的),得到加密后的字符zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9
,我们使用正常的BASE64无法解密。
说明此时,加密逻辑进行了一定的修改,我们进入可以看到其加密逻辑
首先开头一个sub_401000()
函数,感觉肯定有问题啊,我们跟进查看
int sub_401000()
{
int result; // eax
char v1; // cl
for ( result = 6; result < 15; ++result )
{
v1 = byte_40E0AA[result];
byte_40E0AA[result] = byte_40E0A0[result];
byte_40E0A0[result] = v1;
}
return result;
}
查看数组的内容和程序的逻辑,大概就是对原来的Base64解密进行了一个换表的操作,也就是将"HIJKLMNO"和"QRSTUVWXYZ"进行了新的交换。我们拿到新的字符表ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/=
,我们将加密数据和字符表拿到Cyberchef发现还是解不出来,继续往下看,看到最后return了一个sub_401030
函数,进去查看其函数逻辑,发现有一个大小写转换的操作:
int __cdecl sub_401030(const char *a1)
{
__int64 v1; // rax
char v2; // al
v1 = 0i64;
if ( strlen(a1) )
{
do
{
v2 = a1[HIDWORD(v1)];
if ( v2 < 97 || v2 > 122 )
{
if ( v2 < 65 || v2 > 90 )
goto LABEL_9;
LOBYTE(v1) = v2 + 32;
}
else
{
LOBYTE(v1) = v2 - 32;
}
a1[HIDWORD(v1)] = v1;
LABEL_9:
LODWORD(v1) = 0;
++HIDWORD(v1);
}
while ( HIDWORD(v1) < strlen(a1) );
}
return v1;
}
至此我们可以解出真正的flag
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现