首页 > 解决方案 > 在 C 中将长 shellcode 加载到内存中

问题描述

我希望我的 shellcode 在 x86 架构中运行,但是 C 中的 char 数组的限制约为 16k,而我的 shellcode 更长。我打破了 2 个数组上的字符串并开始如下:

char n1qwgimnb8i[] = "\x75\x6d\xf2\x34...";
char n1qwgimnb8i1[] = "\x74\xdf\x39\x37...";

void *zx1rwsnvf4l = VirtualAlloc(0, sizeof n1qwgimnb8i + sizeof n1qwgimnb8i1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

memcpy(zx1rwsnvf4l, n1qwgimnb8i, sizeof n1qwgimnb8i);

memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i, n1qwgimnb8i1, sizeof n1qwgimnb8i1);

CreateThread(NULL, 0, zx1rwsnvf4l, NULL, 0, NULL);

我用 cl 编译并且没有错误,但是当我启动最终的 .exe 时它崩溃了。我做错了什么?

标签: cshellcode

解决方案


数组的字符串样式初始化,char

char hoge[] = "foo";

在数据末尾自动添加终止空字符,此示例等效于

char hoge[] = {'f', 'o', 'o', '\0'};

因此,会在两个数组之间插入一个额外的0x00字节,这可能会造成麻烦。

线

memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i, n1qwgimnb8i1, sizeof n1qwgimnb8i1);

应该

memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i - 1, n1qwgimnb8i1, sizeof n1qwgimnb8i1);

- 1应添加以使副本从原始数据之后开始而不终止空字符)


推荐阅读