0

我很难弄清楚为什么在解密后有效负载不工作example2.cpp,当使用命令'example2.exe > out.txt'执行编译的exe时,我得到了有效的shellcode并且不会导致任何问题example.cpp因为我可以看到输出是hello world(至少在我的情况下)

example.cpp

unsigned char out[] = "\x00\x00...";
int main()
{
    void *exec = VirtualAlloc(0, sizeof(out), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, out, sizeof(out));
    ((void(*)())exec)();
}

example2.cpp

void decrypt_run(){
    std::vector<unsigned char> decrypted(encrypted.size());
    // the encrypted cipher get decrypted and the vector decrypted is filled with unsigned chars
    unsigned char buf[decrypted.size()];
    // converting the vector to an unsigned char buffer to be passed to memcopy 
    std::copy(decrypted.begin(), decrypted.end(), buf);
    size_t shellcodesize = sizeof(buf);
    cout << buf << endl;  // prints the shellcode to the screen 
    //void *exec = VirtualAlloc(0, shellcodesize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    //memcpy(exec, buf, shellcodesize);
    //((void(*)())exec)();
}
int main()
{
    decrypt_run();
    return 0;
}

当取消注释程序中的最后三行时,decrypt_run()除了它自己的 shellcode 之外没有任何输出

out.txt再次使用与中相同的 shellcode,example.cpp它可以完美运行,但不能与example2.cpp

4

1 回答 1

1

在第一种情况下,您将 shellcode 硬编码在一个固定的内存缓冲区中,然后将这些字节原样复制到您分配的可执行内存中。这很好。

但是在第二种情况下,您有一个动态vector填充(解密的)shellcode字节,然后您使用非标准VLA语法分配一个动态数组,将shellcode复制到该数组中,然后将shellcode从该数组复制到你的可执行内存。该中间数组是完全没有必要的,应该删除,您可以将 shellcode 字节直接从 复制vector到可执行内存中,例如:

void decrypt_run(){
    std::vector<unsigned char> decrypted(encrypted.size());
    // the encrypted cipher get decrypted and the vector decrypted is filled with unsigned chars
    // passing the vector to memcopy 
    unsigned char *buf = decrypted.data();
    size_t shellcodesize = decrypted.size();
    cout << buf << endl;  // prints the shellcode to the screen 
    void *exec = VirtualAlloc(0, shellcodesize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, buf, shellcodesize);
    ((void(*)())exec)();
}
于 2022-01-22T00:24:40.260 回答