这段代码会发生什么? (执行char缓冲区)

时间:2014-07-10 09:20:40

标签: c++ c function-pointers

有人可以给我一个关于第二行代码中发生的事情的完整解释吗?

我知道包含shellcode的缓冲区的地址被转换为一个执行的函数指针。但我对所涉及的所有括号和步骤感到困惑,所以我需要更详细的解释。

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会阻止执行,即使它会执行,程序也会崩溃,因为它会在NOP之后执行“随机垃圾”。我的问题只是函数调用的语法。

2 个答案:

答案 0 :(得分:6)

  1. buf(数组名转换为指针)转换为void(*)()函数指针

    (void(*)())buf
    
  2. 通过指针

    调用该函数
    (function_pointer)();
    
  3. 请注意,由于operator precedence规则

    ,这是错误的
    (void(*)()) buf() // Function call has a higher precedence over type cast
    

    所以需要另外一对括号。

    最终执行它(如果DEP允许它,这是系统相关的)和(如果x86) Nop-Nop-Nop等等。

    你是正确的。

    作为旁注:NOP代码也会使您的应用程序崩溃:没有返回语句,并且当有效负载完成时,IP无法恢复。

答案 1 :(得分:1)

  

这是对的吗?我想有一些更详细/正确的解释。

这是一个更清洁的选择:

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();