在C中在内存中加载长外壳代码
我希望我的外壳代码在x86 arch中运行,但C中的字符数组限制为~16k,而我的外壳代码更长。我在2个数组上断开字符串,并按如下方式开始:在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
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。