すべては、CVE-2017-8759 に関するコードを分析したかったときに始まりました。CVE の修正プログラムは、.Net Framework の一部である System.Runtime.Remoting.dll 内の WsdlParser.cs という名前のクラスにあることを知っていました。おそらく、この dll はコンピューターの次のような場所にあります。
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7\System.Runtime.Remoting.dll
ilspycmd を使用してコードを C# に再アセンブルしたところ、出力ディレクトリに WsdlParser.cs がないことに気付きました。
後で CFF Explorer を使用したところ、TypeDefs のメタデータにこの型が実際に存在しないことがわかりました。
しかし、私はこのクラスが存在することを知っています:
- Microsoft のドキュメントにあります: 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 エクスプローラーを使用してメタデータを調べました。内部クラスは、本来あるべき姿で、デバッグおよびリリース ビルドに存在していました。
では、このブードゥー教は何ですか?
みんなありがとう。