这一切都始于我想分析 CVE-2017-8759 周围的代码。我知道 CVE 的修复程序位于 System.Runtime.Remoting.dll 中名为 WsdlParser.cs 的类中,该类是 .Net 框架的一部分。您的计算机上可能有此 dll,位置类似于:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7\System.Runtime.Remoting.dll
我使用 ilspycmd 将代码重新组装回 C#,并注意到输出目录中缺少 WsdlParser.cs:
后来我使用了 CFF Explorer,发现 TypeDefs 的元数据中确实缺少这种类型:
但是,我知道这个类是存在的:
- 它在微软的文档中:https ://referencesource.microsoft.com/System.Runtime.Remoting/metadata/wsdlparser.cs.html
使用反射和 LoadAssembly() 时,我能够找到该类:
Assembly assembly = Assembly.LoadFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7\System.Runtime.Remoting.dll"); foreach (var type in assembly.GetTypes()) { if (!type.FullName.EndsWith("WsdlParser")) { continue; } Console.WriteLine("Great Success"); }
我注意到此行为与此 dll 中的所有内部类一致,但我不明白它的意义。我的猜测是可能有一个构建后过程来删除内部类型的数据,但如果是这样,我如何能够通过加载程序集来找到该类?我认为 CIL 使用 TypeDef 元数据加载类型,但是是否有额外的空间来存储这些数据?
为了更好地理解它,我创建了一个带有内部类的 C# 测试项目,并使用 CFF Explorer 检查了元数据。内部类在调试和发布版本中应该存在。
那么这个巫毒是什么?
多谢你们。