本帖最后由 go4399 于 2026-1-21 14:24 编辑
dnSpy单步调试得到
using System.Runtime.CompilerServices;
using System.Text;
namespace Crackme
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Crackme-v1");
Console.WriteLine("请根据下面的字符串计算出密码");
Console.WriteLine();
var text = RandomString(30);
var text2 = text + "Z";
Console.WriteLine(text2 ?? "");
Console.Write("请输入密码: ");
var text3 = Console.ReadLine();
var text4 = EncryptString(text, GetKey());
if (text3 == text4 && text3.Length == 30)
{
Console.WriteLine("\n🎉 恭喜!挑战成功!");
Console.WriteLine("Flag: CTF{" + text4 + "}");
}
else
{
Console.WriteLine("\n❌ 验证失败!");
Console.WriteLine("正确答案应该是: " + text4);
var dish = new DefaultInterpolatedStringHandler(7, 1);
dish.AppendLiteral("长度: ");
dish.AppendFormatted(text4.Length);
dish.AppendLiteral(" 字符");
Console.WriteLine(dish.ToStringAndClear());
}
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
private static string RandomString(int len)
{
var text = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var sb = new StringBuilder();
var rand = new Random();
for (int i = 0; i < len; i++)
{
sb.Append(text[rand.Next(text.Length)]);
}
return sb.ToString();
}
private static byte[] GetKey()
{
return
[
4, 0, 1, 3, 2, 4, 2, 1, 0, 1, 2,
4, 1, 2, 3, 4, 3, 4, 2, 4, 1, 4
];
}
private static string EncryptString(string str, byte[] key)
{
foreach (var c in key)
{
switch (c)
{
case 0:
str = Encrypt0(str);
break;
case 1:
str = Encrypt1(str);
break;
case 2:
str = Encrypt2(str);
break;
case 3:
str = Encrypt3(str);
break;
case 4:
str = Encrypt4(str);
break;
}
}
return str;
}
private static string Encrypt0(string str)
{
return str.Replace('A', 'Z');
}
private static string Encrypt1(string str)
{
var text = str.Substring(5, 15);
return str.Replace(text, "") + text;
}
private static string Encrypt2(string str)
{
var text = str.Substring(10, 10);
return text + str.Replace(text, "");
}
private static string Encrypt3(string str)
{
return str.Replace('Z', 'C');
}
private static string Encrypt4(string str)
{
return str.Replace('C', 'A');
}
}
}
|