首页
论坛
课程
招聘
[原创]2019看雪CTF 晋级赛Q1 第10题
2019-3-23 13:10 1165

[原创]2019看雪CTF 晋级赛Q1 第10题

2019-3-23 13:10
1165
使用.net编写,用Reflector反编译看一下:
private static void a(string[] A_0)
{
    Console.WriteLine("Please Input Serial:");
    if (a(Console.ReadLine(), "Kanxue2019") == "4RTlF9Ca2+oqExJwx68FiA==")
    {
        Console.WriteLine("Congratulations!  : )");
        Console.ReadLine();
    }
}
如果a函数的返回值为 “4RTlF9Ca2+oqExJwx68FiA==”表示成功。看一下a函数,如下:
public static string a(string A_0, string A_1)
{
    byte[] bytes = Encoding.UTF8.GetBytes("Kanxue2019CTF-Q1");
    byte[] buffer = Encoding.UTF8.GetBytes(A_0);
    byte[] rgbKey = new PasswordDeriveBytes(A_1, null).GetBytes(0x20);
    ICryptoTransform transform = new RijndaelManaged { Mode = CipherMode.CBC }.CreateEncryptor(rgbKey, bytes);
    MemoryStream stream = new MemoryStream();
    CryptoStream stream1 = new CryptoStream(stream, transform, CryptoStreamMode.Write);
    stream1.Write(buffer, 0, buffer.Length);
    stream1.FlushFinalBlock();
    byte[] inArray = stream.ToArray();
    stream.Close();
    stream1.Close();
    return Convert.ToBase64String(inArray);
}


看起来是使用标准的.net加密算法进行加密。其中“Kanxue2019”作为秘钥,用户输入作为被加密的数据。
1、将 “Kanxue2019” 转换为utf8字节数据。 (bytes)
2、 将用户输入转换为utf8字节数据。  
3、调用 PasswordDeriveBytes函数产生一个rgbKey
4、使用 bytes与 rgbKey 作为输入调用RijndaelManaged产生一个 ICryptoTransform transform
5、new 一个  MemoryStream()
6、new  RijndaelManaged,调用CryptoStream 的write进行数据加密
7、将加密后的数据转换成base64,返回。
8、结果为“ “4RTlF9Ca2+oqExJwx68FiA== ”即可。
整个程序都使用标准的.net库实现,在微软官方中找到一个相关的加解密算法:这里
使用C#进行逆向。代码如下:
 static string DecryptStringFromBytes(string cipherText1, byte[] Key, byte[] IV)
{
    byte[] cipherText = Convert.FromBase64String(cipherText1);
    // Check arguments.
    if (cipherText == null || cipherText.Length <= 0)
        throw new ArgumentNullException("cipherText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("IV");

    // Declare the string used to hold
    // the decrypted text.
    string plaintext = null;

    // Create an RijndaelManaged object
    // with the specified key and IV.
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = Key;
        rijAlg.IV = IV;
        rijAlg.Mode = CipherMode.CBC;
        // Create a decryptor to perform the stream transform.
        ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

        // Create the streams used for decryption.
        using (MemoryStream msDecrypt = new MemoryStream(cipherText))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                {
                    // Read the decrypted bytes from the decrypting stream
                    // and place them in a string.
                    plaintext = srDecrypt.ReadToEnd();
                }
            }
        }
    }
    return plaintext;
}

 string sn = "4RTlF9Ca2+oqExJwx68FiA==";
 string roundtrip = DecryptStringFromBytes(sn, key, iv);
得到 flag : Kanxue2019Q1CTF





2020 KCTF秋季赛【攻击篇】正在火热进行中!

最后于 2019-3-23 13:14 被ODPan编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回