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)();
    
  • 注意,由于规则的原因,这是错误的

    因此,需要另一对括号

    最终执行它(如果允许,这取决于系统)和(如果x86)Nop Nop Nop Nop等

    你是对的

    作为旁注:NOP代码也会使你的应用程序崩溃:没有返回语句,当有效负载完成时也不会恢复

    这是正确的吗?我想得到更详细/正确的解释

    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正式地使它成为可选的。