常见的加载方式

1.内联汇编加载

使用内联汇编只能加载32位程序的ShellCode,因为64位程序不支持写内联汇编

#pragma comment(linker, "/section:.data,RWE") //将data段的内存设置成可读可写可执行
#include <Windows.h>

//ShellCode部分
unsigned char buf[] = "";

void main() {
    
	__asm {
		lea eax,buf    // 将buf的地址加载到eax寄存器
		call eax  // 使用call指令跳转到eax寄存器指向的地址(即buf),开始执行shellcode
	}
}

2.使用函数指针加载

如下代码所示,(void(*)(void))是一个函数指针类型的强制转换, 该函数指针指向一个没有参数且返回值类型为void的函数,也就是说这行代码将 buf 的地址转换为一个函数指针,然后调用该指针所指向的函数,其实这种方法和上述加载方式原理是一样的,只不过这种方法还能用于加载64位的ShellCode

3.创建线程加载

上述两种方法都需要将data节的内存设置成可读可写可执行, 以下这段代码的主要作用是在内存中分配一段可执行的内存空间,将buf数组中的内容复制到该内存空间,并创建一个新线程来执行这段内存中的代码

下述是申请内存加载的python版本代码:

4.通过堆加载

这段代码首先创建了一个具有执行权限的堆,然后在堆中分配内存并将shellcode复制到内存中。最后,代码通过直接调用存储在内存中的shellcode来执行它

5.基于资源节加载

导入资源

使用MSF生成bin文件,随后点击添加资源->导入,并选择生成的bin文件

image-20240216212924070

然后自定义bin文件的资源类型, 此处我自定义的类型为"shellcode",当然你也可以定义成其它的名字

image-20240216212931316

添加完资源后会在当前项目生成一个resource.h, 代码如下所示,这里只需注意这段代码#define IDR_SHELLCODE1 101

实现代码

以下是完整shellcode加载器代码:

最后更新于