int __cdecl sub_4017F0(int a1)
{
int result; // eax@6
char Str1[28]; // [sp+D8h] [bp-24h]@4
int v3; // [sp+F4h] [bp-8h]@1
int v4; // [sp+F8h] [bp-4h]@1
v4 = 0;
v3 = 0;
while ( *(_DWORD *)(a1 + 4 * v4) < 62 && *(_DWORD *)(a1 + 4 * v4) >= 0 )
{
Str1[v4] = aAbcdefghiabcde[*(_DWORD *)(a1 + 4 * v4)];
++v4;
}
Str1[v4] = 0;
if ( !strcmp(Str1, "KanXueCTF2019JustForhappy") )
result = sub_401770();
else
result = sub_4017B0();
return result;
}
.rdata:00403580 aAbcdefghiabcde db 'abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ',0
关键逻辑 我用C# 写出来了 写的有点烂 大家见笑了
int[] v5 = new int[26];
string Str = Console.ReadLine();
if (Str != string.Empty)
{
for (int i = 0; i < Str.Length; ++i)
{
if (Str[i] > 57 || Str[i] < 48)
{
if (Str[i] > 122 || Str[i] < 97)
{
if (Str[i] > 90 || Str[i] < 65)
Console.WriteLine("错误");
else
v5[i] = Str[i] - 29;
}
else
{
v5[i] = Str[i] - 87;
}
}
else
{
v5[i] = Str[i] - 48;
}
}
string s = "";
string abc = "abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ";
for(int i = 0; i < v5.Length; i++)
{
if (v5[i] < 62 && v5[i] >= 0)
{
s += abc[v5[i]];
}
}
if (s.StartsWith("KanXueCTF2019JustForhappy"))
{
Console.WriteLine("恭喜");
}
Console.ReadKey();
}
else
{
Console.WriteLine("请输入pass!");
}
下边是 python 写的解密码代码
#!/usr/bin/python
a = 'abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ'
b = 'KanXueCTF2019JustForhappy'
for c in b:
i = a.find(c)
s = i + 48
if s <= 57 and s >= 48 :
print(chr(s))
else :
s = i + 87
if s <= 122 and s >= 97 :
print(chr(s))
else :
s = i + 29
if s <= 90 and s >= 65:
print(chr(s))