首页
论坛
课程
招聘
[原创]CTF2019_第十题_初入好望角WriteUp
2019-3-20 01:19 835

[原创]CTF2019_第十题_初入好望角WriteUp

2019-3-20 01:19
835



第十题 初入好望角WriteUp

1-   工具

        ILSpy 2.1.0.1603:查看源码

        VS2017:调试、写解密代码

2-   分析

       a.打开文件,查看判定序列串正确的部分源码如图


            通过代码可见,只要a.a(输入的内容,”Kanxue2019”)的值等于“4RTlF9Ca2+oqExJwx68FiA==”即可判断成功。

     b.分析函数a.a,打开源码如图


          很明显代码对输入的string和”Kanxue2019”进行了某种加密,下面只要对加密过程逆向一下就好了。

3-    解密

    a.  源码算法分析(因为对加密算法和C#语言都不熟悉,这部分可能分析有误)

public static string a(string A_0, string A_1)
{
    byte[] bytes = Encoding.UTF8.GetBytes("Kanxue2019CTF-Q1");
    byte[] bytes2 = Encoding.UTF8.GetBytes(A_0);
    byte[] bytes3 = new PasswordDeriveBytes(A_1, null).GetBytes(32);
    ICryptoTransform transform = new RijndaelManaged
    {
        Mode = CipherMode.CBC
    }.CreateEncryptor(bytes3, bytes);

MemoryStream memoryStream = new MemoryStream();
    CryptoStream expr_4F = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
    expr_4F.Write(bytes2, 0, bytes2.Length);
    expr_4F.FlushFinalBlock();
    byte[] inArray = memoryStream.ToArray();
    memoryStream.Close();
    expr_4F.Close();
    return Convert.ToBase64String(inArray);
}
         从代码中可以看到,程序利用Rijndael加密算法CBC加密模式对用户输入的String进行了加密,其中“Kanxue2019”和"Kanxue2019CTF-Q1",作为加密算法的Key或者算子(不太清楚)参与加密过程。

        解密的话直接代码搬到VS中修改调试。因为对C#加密类不熟悉,走了很多弯路,以下是在网上搜到的Rijndael解密部分代码:

 static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
    {        // 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 Rijndael object
        // with the specified key and IV.
        using (Rijndael rijAlg = Rijndael.Create())
        {  rijAlg.Key = Key;
            rijAlg.IV = IV;
            // 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;
    }

       当然,要解密程序不需要理解这么多,直接引入函数,调用即可:

        byte[] bytes = Encoding.UTF8.GetBytes("Kanxue2019CTF-Q1");

        byte[] bytes2 = Convert.FromBase64String(A_0);

        byte[] bytes3 = new PasswordDeriveBytes(A_1, null).GetBytes(32);

        Console.WriteLine(DecryptStringFromBytes(bytes2,bytes3,bytes));

     输入字符串A_0:4RTlF9Ca2+oqExJwx68FiA==,得到结果:Kanxue2019Q1CTF


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

收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 1256
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:22 )
在线值:
发帖
回帖
粉丝
QIXIYA 活跃值 2019-3-20 01:23
2
0
注册账号好几年了,但一直没有认真学习过。前几天刚刚买了看雪的【加密与解密4】,打算好好学习,正好遇到了看雪的CTF,于是心潮澎湃赶来试下简单点的题目,一边网上查资料,一边下载工具,一边看论坛以往CTF的writeUp学习,终于做出来了,开心。
游客
登录 | 注册 方可回帖
返回