全国工业互联网安全技能大赛- Re backdoor

by Netfairy - 2020-10-25

题目:Re  backdoor 

变量管理器遭到恶意修改,寻找变量管理器中包含的重要flag。

backdoor.zip
打开发现


111.png


随便输入,点Login没反应。这是个C#程序,使用dnSpy打开


222.png


在下面的代码出下断点,运行后随便输入,然后程序中断,这里就是关键的判断地方,具体算法逻辑通过逆向调试分析得知为1. DES加密 2. 连续三次base64加密。


333.png


DES加密密钥为


555.png


然后将结果和一个值比较,这个值通过调试得出为:ZGpSWWJtMVFSalJHVEVkck5rOWFaM0kyUjNVdlp6MDk=


666.png

根据加密算法,编写解密算法如下,我把加密部分也写出来:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryStream memoryStream;
            memoryStream = new MemoryStream();
            Console.Write("输入明文:You got the key\n");
            //加密第一步,DES加密
            byte[] bytes = Encoding.UTF8.GetBytes("You got the key"); //输入明文
            DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
            descryptoServiceProvider.Key = Encoding.ASCII.GetBytes("flagflag");
            descryptoServiceProvider.IV = Encoding.ASCII.GetBytes("flagflag");
            CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateEncryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(bytes, 0, bytes.Length);
            cryptoStream.FlushFinalBlock();
            string a = Encoding.ASCII.GetString(memoryStream.ToArray());
            Console.Write("DES加密结果:" + a + "\n");
            //加密第二步,base64加密
            string b = Convert.ToBase64String(memoryStream.ToArray());
            Console.Write("base64第一次加密结果:" + b + "\n");
            //加密第三步,base64加密
            byte[] c = Encoding.UTF8.GetBytes(b);
            string d = Convert.ToBase64String(c);
            Console.Write("base64第二次加密结果:" + d + "\n");
            //加密第四步,base64加密
            byte[] e = Encoding.UTF8.GetBytes(d);
            string f = Convert.ToBase64String(e);
            Console.Write("base64第三次加密结果:"+ f + "\n\n");

            Console.Write("输入密文:"+f+"\n");
            //解密第一步,base64解密
            byte[] aa = Convert.FromBase64String("ZGpSWWJtMVFSalJHVEVkck5rOWFaM0kyUjNVdlp6MDk=");  //这里传递需要解密的密文
            string bb = System.Text.Encoding.ASCII.GetString(aa);
            Console.Write("base64第一次解密结果:" + bb + "\n");
            //解密第二步,base64解密
            byte[] cc = Convert.FromBase64String(bb);
            string dd = System.Text.Encoding.ASCII.GetString(cc);
            Console.Write("base64第二次解密结果:"+dd + "\n");
            //解密第三步,base64解密
            byte[] ee = Convert.FromBase64String(dd);
            string ff = System.Text.Encoding.ASCII.GetString(ee);
            Console.Write("base64第二次解密结果:" + ff + "\n");
            //解密第四步,DES解密,密钥flagflag
            MemoryStream ms = new MemoryStream();
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Key = ASCIIEncoding.ASCII.GetBytes("flagflag");
            des.IV = ASCIIEncoding.ASCII.GetBytes("flagflag");
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(ee, 0, ee.Length);
            cs.FlushFinalBlock();
            Console.Write("DES解密结果:"+System.Text.Encoding.ASCII.GetString(ms.ToArray()) + "\n\n");
        }

    }
}


777.png


输入 You got the key,登录

888.png