关于.net:茫茫内存我该如何用-windbg-找到你

259次阅读

共计 2457 个字符,预计需要花费 7 分钟才能阅读完成。

一:背景

1. 讲故事

前天 wx 上有个敌人丢给我一个 dump,让我帮忙鉴定一下某些敏感信息在内存中是否也是加密的,当初数据安全很重要,不仅数据库中的信息要加密,灌到内存后数据同样也需密文存储,随用随解密,争取平安最大化😄,此为背景,接下来就是我艹,这咋让我鉴定呀?😂😂😂

二:如何鉴定

1. 思考

我艹几秒后,冷静下来想想还是有肯定解决办法的,我先把问题化简一下。

  • 判断内存中是否有字符串为 张三 or 李四 or 王五 的明文字符。
  • 判断内存中是否存在各自明文的 md5。

下面两点检索一下,根本就能确定那些敏感信息是否加密了。

像 C# 这种托管语言有一个益处,就是所有的托管对象都是寄存在 托管堆 上,话中有话就是字符串也在 托管堆 上,所以接下来的问题是如何在堆上检索 string= 张三 的字符串。

问题来了,很多时候 托管堆 上的 string 是海量的,我见过最高有几千万个,string 茫茫,何时能力找到我最靓的崽呀 😤😤😤,实践工夫完结,接下来开始打怪。

2. 案例演示

为了可能持续聊上来,我用一个简略的例子演示一下如何通过人肉搜寻 string= 张三,先看代码。


    class Program
    {static List<string> strList = new List<string>();
        static void Main(string[] args)
        {strList.Add("fake");
            strList.Add("张三");

            Console.ReadLine();}
    }

接下来祭出 windbg。

  • !dumpheap -type System.String -min 8 -max 15 找到所有 10-15byte 范畴的字符串。

0:000> !dumpheap  -type System.String -min 8 -max 15
 Address       MT     Size
026f1228 652224e4       14     
026f164c 652224e4       16     
026f230c 65222d74       12     
...

Statistics:
      MT    Count    TotalSize Class Name
65225468        1           12 System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib]]
65222d74       10          156 System.String[]
652224e4       65         1168 System.String
Total 76 objects

从输入中能够看出,以后 size 范畴内有 1168 个 string,还发现这个 size 不是特地准,先不论了,string 尽管有点多,但还是能够人肉的,用 !do xxx 一一查看。


0:000> !do 026f2354
Name:        System.String
MethodTable: 652224e4
EEClass:     65327690
Size:        18(0x12) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String:      张三
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
652242a8  4000283        4         System.Int32  1 instance        2 m_stringLength
65222c9c  4000284        8          System.Char  1 instance     5f20 m_firstChar
652224e4  4000288       70        System.String  0   shared   static Empty
    >> Domain:Value  00a22530:NotInit  <<

看到没有,下面的 String: 张三 就是我要的后果, 明文存储 实锤。

文章到此是不是能够完结啦 🙃🙃🙃,那就太没有实战经验了,方才说了,很多时候筛选后的 string 也可能高达几万几十万,再用人肉那是不可能的。。。

那有没有代替人肉的脚本呢?😜😜😜,嘿嘿,还真有。。。

三:应用自动化脚本

当初的 windbg preview 反对 javacript 作为脚本扩大,接下来我筹备把方才的 人肉步骤 写入脚本,貌似业余名字叫 playbook,糟糕脚本如下:


"use strict";

function RunCommands() {

    var ctl = host.namespace.Debugger.Utility.Control;
    var str_address_list = ctl.ExecuteCommand("!dumpheap  -type System.String -min 8 -max 15 -short");

    for (var str_address of str_address_list) {var str_dump = ctl.ExecuteCommand("!do -nofields" + str_address);

        var str = str_dump.Last();

        var isContains = str.indexOf("张三") > 0;

        if(isContains) host.diagnostics.debugLog(str+""+str_address +"\n");
    }
}

脚本的逻辑还是非常简单的,就是模仿方才的人肉,最初在输入内容中判断是否有 张三 的字符串,如果有,连同 address 地址一起打印进去,脚本保留好之后,用 dx 命令来执行 RunCommands() 函数。


0:000> dx Debugger.State.Scripts.RunCommands.Contents.RunCommands()
String:      张三  026f2354
Debugger.State.Scripts.RunCommands.Contents.RunCommands()

看到没有,明文 张三 显示进去了,不信的话,我截一张图,证实我没有骗你 🤭🤭🤭。

四:总结

在这个案例中最初应用了 js 脚本轻松搞定,能够看出,脚本给了 windbg 有限的开掘可能, 真的是太强大了,有趣味的话可参考 MSDN:https://docs.microsoft.com/en…

正文完
 0