Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中在内存中加载长外壳代码_C_Shellcode - Fatal编程技术网

在C中在内存中加载长外壳代码

在C中在内存中加载长外壳代码,c,shellcode,C,Shellcode,我希望我的外壳代码在x86 arch中运行,但C中的字符数组限制为~16k,而我的外壳代码更长。我在2个数组上断开字符串,并按如下方式开始: char n1qwgimnb8i[] = "\x75\x6d\xf2\x34..."; char n1qwgimnb8i1[] = "\x74\xdf\x39\x37..."; void *zx1rwsnvf4l = VirtualAlloc(0, sizeof n1qwgimnb8i + sizeof n1qwg

我希望我的外壳代码在x86 arch中运行,但C中的字符数组限制为~16k,而我的外壳代码更长。我在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编译,没有错误,但当我启动final.exe时,它崩溃了。我做错了什么?

字符串式初始化
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
以使副本从原始数据的正后方开始,而不终止空字符)

假定您正在使用程序或脚本生成这些字符串,那么为什么不生成数组语法呢<代码>无符号字符foo[]={0x75,0x6d,0xf2,0x34,…}。我认为任何一个好的编译器都不会对它的大小有一个很低的限制。它还可以避免不必要的终止nul。