c++ - 通过转换为 Visual C++ 中的函数指针来执行 shellcode

标签 c++ casting shellcode

在 gcc 中这工作正常。代码是这样的:

unsigned char b[50] = "\xda\xd1 ... \x0"; //some shellcode with terminating \x0
( (void(*)())b )(); //cast b to function pointer from void to void, then run it

但是当它被放入 Visual C++ 时,它会吐出这个错误信息:

1>..\test.cpp(132): error C2440: 'type cast' : cannot convert from 'unsigned char [50]' to 'void (__cdecl *)(void)'
1>          There is no context in which this conversion is possible

有人知道为什么会这样吗?

最佳答案

合适的调试器会告诉您哪里出了问题。我只能猜测您的代码导致了访问冲突,因为您要跳转到的缓冲区不可执行。

可能您使用的是默认值- DEP -enabled 系统,如 Vista 或 7,所以你必须确保你的 shellcode 是可执行的。为此,首先使用 VirtualAlloc 分配一个新的可执行缓冲区并将您的 shellcode 复制到其中,然后执行它:

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

顺便说一句,您不需要以 null 终止 shellcode(C++ 会自动为您终止字符串文字,但这不是必需的)。您也不需要指定尺寸:

unsigned char b[] = "\xcc";

关于c++ - 通过转换为 Visual C++ 中的函数指针来执行 shellcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9593287/

相关文章:

c++ - 官方ZeroMQ多线程示例的修改版本崩溃

c++ - Emscripten 的 CMake 项目

C++ 风格的指针转换为整数

具有父类(super class)引用的 java 转换

c - 从c中的文件中读取十六进制值

c - Shellcode:执行 2 次 execve() 调用

c - 理解一个shellcode例子

c++ - 枚举所有 T 的所有 SomeClass<T> 对象

c++ - 如何在定义类之前使用它?

java - 自动售货机改变Java