C++ 这段代码中发生了什么?(执行字符缓冲区)
有人能给我一个完整的解释在这第二行代码中发生了什么吗 我知道,包含外壳代码的缓冲区的地址被强制转换为执行的函数指针。但是我对所有涉及的支架和步骤都有点困惑,所以我需要更详细的解释C++ 这段代码中发生了什么?(执行字符缓冲区),c++,c,function-pointers,C++,C,Function Pointers,有人能给我一个完整的解释在这第二行代码中发生了什么吗 我知道,包含外壳代码的缓冲区的地址被强制转换为执行的函数指针。但是我对所有涉及的支架和步骤都有点困惑,所以我需要更详细的解释 unsigned char buf[] = "\x90\x90\x90\x90\x90\x90\x90\x90"; ((void(*)())buf)(); 我试着这样对自己解释: buf //address of the buffer containing code void
unsigned char buf[] = "\x90\x90\x90\x90\x90\x90\x90\x90";
((void(*)())buf)();
我试着这样对自己解释:
buf //address of the buffer containing code
void(*)() //"type" function pointer returning void, no parameters
(void(*)()) buf //cast buf to said type
( (void(*)()) buf )() //take the outcome of the cast and execute it by appending ()
这是正确的吗
编辑:
我知道DEP会阻止执行,即使它会执行,程序也会崩溃,因为它会在NOPs之后执行“随机垃圾”。我的问题只是关于函数调用的语法
buf
(数组名转换为指针)转换为void(*)(
函数指针
(void(*)())buf
(function_pointer)();
unsigned char buf[] = "\x90\x90\x90\x90\x90\x90\x90\x90";
((void(*)())buf)();
这里有一个更干净的选择:
unsigned char buf[] = "\x90\x90\x90\x90\x90\x90\x90\x90";
// ((void(*)())buf)();
// equivalent code:
typedef void (*void_callback)(); // declare the function pointer as a named type
void_callback callback = reinterpret_cast<void_callback>(buf);
callback();
unsigned char buf[]=“\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90”;
//((无效(*)buf)();
//等效代码:
typedef void(*void_callback)(;//将函数指针声明为命名类型
void_callback callback=reinterpret_cast(buf);
回调();
在启用DEP的系统上,我知道这一点。让我们假设DEP不是活动的,并且/或者我已经使用VirtualAlloc或者类似的东西分配了可执行内存。最后一行只调用函数()
。在非DEP系统上,它可能也会崩溃。我缺少字符串末尾的RET
<代码>\x90是NOP
。在最后一次NOP
之后,您的程序将不可预测地执行任何操作。DEP代表数据执行预防。注意:在C++03和C99中,不允许将非函数指针强制转换为函数指针(尽管它是一个常见的扩展)。C++11正式地使它成为可选的。