【问题标题】:Shellcode execution in C++ [duplicate]C ++中的Shellcode执行[重复]
【发布时间】:2021-12-30 06:11:35
【问题描述】:

从事一些测试项目,我有这段代码,效果很好:

#include <windows.h>
#include <iostream>

using namespace std;

int main(int argc, char** argv) {
    char shellcode[] = "..snip..\xa0\x4e\xbc\x0b\x45\xee\xb3\x1b\xf9..snip..";
    void* exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, shellcode, sizeof shellcode);
    ((void(*)())exec)();
    return 0;
}

但我试图通过 shellcode 传递动态大小的字节数组,这不会执行代码:

int main(int argc, char** argv) {

    std::string(test) = "..snip..\xa0\x4e\xbc\x0b\x45\xee\xb3\x1b\xf9..snip..";

    char* shellcode = new char[test.size()];

    memcpy(shellcode, test.data(), test.size());
    //std::copy(test.begin(), test.end(), shellcode);
    //delete[] shellcode;
    //std::cout << shellcode;

    void* exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    memcpy(exec, shellcode, sizeof shellcode);

    ((void(*)())exec)();
    //return 0;
}

谁能指出问题出在哪里?或者我该如何改进?

【问题讨论】:

  • 可变长度数组 (VLA) 不是标准 C++ 的一部分 - 但一些编译器支持它们作为语言扩展。不要使用 VLA。如果需要动态数组,请使用 std::vector。

标签: c++


【解决方案1】:

在您的第一个示例中,sizeof shellcode 是数组本身的大小。在您的第二个示例中,sizeof shellcode 是指针的大小。它总是 4 或 8。
将 VirtualAlloc 和后续的 memcpy 语句更改为:

void* exec = VirtualAlloc(0, test.size(), MEM_COMMIT, PAGE_EXECUTE_READWRITE);

memcpy(exec, shellcode, test.size());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2017-10-06
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多