NuclearEngine 发表于 2021-8-3 00:23

某机房管理软件管理员密码加密算法的分析

本帖最后由 NuclearEngine 于 2021-8-3 00:40 编辑


最近机房老师给电脑安装了此软件以加强对上课纪律的管理,因此将其拿来开刀{:1_886:}

惯例查壳

可以清楚的看到基于VB.NET框架开发,加了个Reactor4的弱混淆壳,直接de4dot扒了,拖进DNSPY
找到主窗口处理函数m1

非常的混乱。。。。。。。
仔细一看
很多都是无效代码(关于软件细节功能的部分略去,不在此讨论)




分析开始
```
                                                                IL_309:
                              num2 = 40;
                              this.Label2.Text = "原密码不正确,请重新输入!";
                              IL_31C:
                              num2 = 41;
                              this.pd_old.Text = "";
```

找到密码对比分析关键处
回到导致跳转到309的判断处

```
if (Operators.CompareString(left2, text, false) != 0)
         {
                     goto IL_309;
         }
```

很显然其对比了left2与text的值,相等则通过校验

回到代码上,调用left2的地方
找到两处

```
string left2 = Class7.smethod_0(this.pd_old.Text);//对话框读取并初次处理
```

```
left2 = Class7.smethod_2(left2);//再次处理
```
从left2基本可以得出其校验算法

进入method0

大致浏览 看到了标志性的DES加密算法

```
                                                DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
                        IL_1AE:
                        num2 = 23;
                        Encoding.Default.GetBytes(string_0);
                        IL_1BD:
                        num2 = 24;
                        descryptoServiceProvider.Key = Encoding.UTF8.GetBytes(s);
                        IL_1D3:
                        num2 = 25;
                        descryptoServiceProvider.IV = Encoding.UTF8.GetBytes(s2);
                        IL_1E9:
                        num2 = 26;
                        MemoryStream memoryStream = new MemoryStream();
                        IL_1F3:
                        num2 = 27;
                        CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateEncryptor(), CryptoStreamMode.Write);
                        IL_207:
                        num2 = 28;
                        StreamWriter streamWriter = new StreamWriter(cryptoStream);
```

```
result = Class7.smethod_3(string_);
return result;
```


浏览一下代码 可以得到基本逻辑

Method0逻辑:读取对话框内容(老密码)---->获取系统盘路径作为des加密算法的密钥和偏移量----->对老密码进行des加密------>带入method3再次处理

进入method3

一眼看到关键处:经典的移位加密
```
byte b3 = checked((byte)num4);
                        for (b = 1; b <= b3; b += 1)
                        {
                              IL_102:
                              num2 = 22;
                              string @String = Strings.Mid(string_0, (int)b, 1);
                              IL_111:
                              num2 = 23;
                              string str = Conversions.ToString(Strings.Chr(checked(Strings.Asc(@string) - 10)));
                              IL_12A:
                              num2 = 24;
                              text += str;
                              IL_138:
                              num2 = 25;
                        }
                        IL_148:
                        num2 = 26;
                        result = text;
```


每位的asc码向前移10,这好办逆回去就行,这也不是大问题。。。。。自以为差不多准备收工

Method3逻辑:将method0得到的des密文每位前移10个asc码

最后抱着看不看无所谓的态度进了method2准备瞧瞧这是干什么的

晴天霹雳!

标准的MD5 hash算法乍一眼看没加盐:shutup:
```
                                                MD5CryptoServiceProvider md5CryptoServiceProvider = new MD5CryptoServiceProvider();
                        IL_ED:
                        num2 = 20;
                        byte[] array2 = md5CryptoServiceProvider.ComputeHash(Encoding.Default.GetBytes(string_0));
                        IL_104:
                        num2 = 21;
                        StringBuilder stringBuilder = new StringBuilder();
```

管他MD5还是5DM,有彩虹表,怕啥?继续。。。。。

```
result = Strings.Mid(str, 11, 30);
```

额。。。。。它对比的好像不是完整的32位md5,是中间的一小个片段。。。。。。。

Metho2逻辑:计算method3处理过的密文的MD5,并返回其11到32位子串


------------------------------------------------------

分析到此心已基本亮了半截

看一下密码总逻辑:

Method0 逻辑:读取对话框内容(老密码)---->获取系统盘路径作为des加密算法的密钥和偏移量----->对老密码进行des加密------>带入method3再次处理
Method3逻辑:将method0得到的des密文每位前移10个asc码
Metho2逻辑:计算method3处理过的密文的MD5,并返回其11到32位子串
最后对比储存着密码特征值与输入的特征值进行校验

也就是说就算我撞出一样的md5,我也没有办法推导过des解密这关,众所周知des对密文要求很高。。。。。。。


开发者的细节处理相当的不错,也就是说。。嗯。。。推导出密码的可能性微乎其微


文章的最后,再来分享一个解密过程中遇到的一个小坎。

也就是在寻找其特征码存在何处时,真的一开始完全摸不着头脑。。。(作者写了很多迷惑干扰的注册表路径。。)

知道我发现了这个:
```
string text = "7]F8H]&gd9*fCAd(B9(Z9PEIl+";text += "P::9mnJ8,@b'I?I%.3";
```
非常可疑的字符串,调试走一下发现text就是特征码注册表路径的des加密密文,密钥还是之前method0里的,‘


唉。

这细节!绝了!


总结一下:开发者写的这种混合加密方式确实是对于MD5算法的一种不错的加强,尤其是在如今高算力时代,碰撞的时间复杂度早已大大降低。当然今天的目的还是没有达成,但也收获了一种值得学习的安全技巧。

样本链接:https://nuclear.lanzoui.com/i6R3ls5vrvc























JuncoJet 发表于 2021-8-3 09:33

结论呢,解出来没

shayu2021 发表于 2021-8-3 16:34

温柔 发表于 2021-8-3 00:42

我有个想法,你可以偷偷改了程序代码,让他的密码可以明文保存,那么只要老师管理一次的话.....

NuclearEngine 发表于 2021-8-3 00:50

温柔 发表于 2021-8-3 00:42
我有个想法,你可以偷偷改了程序代码,让他的密码可以明文保存,那么只要老师管理一次的话.....

钓鱼也不是不行,伪造密码输入框{:1_886:}

kanxue2018 发表于 2021-8-3 00:52

好东西,学习

why174980 发表于 2021-8-3 07:06

学习学习,好东西

shayu2021 发表于 2021-8-3 07:18

xxjj999 发表于 2021-8-3 07:32

谢谢楼主分享

mdx005 发表于 2021-8-3 08:06

感谢楼主大神无私分享,又可以学习了

asdfgh2011 发表于 2021-8-3 08:32

思路挺新颖的。

zx2700 发表于 2021-8-3 08:43

膜拜大佬 学习学习
页: [1] 2 3 4 5
查看完整版本: 某机房管理软件管理员密码加密算法的分析