【问题标题】:What happens in this code? (Executing a char buffer)这段代码会发生什么? (执行一个字符缓冲区)
【发布时间】:2014-08-31 14:34:07
【问题描述】:

谁能给我一个完整的解释这第二行代码中发生了什么?

我知道包含 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 之后执行“随机垃圾”。我的问题只是关于函数调用的语法。

【问题讨论】:

  • 在启用 DEP 的系统上,这只会崩溃
  • 我知道这一点。让我们假设 DEP 不活跃和/或我已经使用 VirtualAlloc 或类似的东西分配了可执行内存。
  • 除了最后一行,你是对的。最后一行只是调用function()
  • 在非 DEP 系统上,它也可能会崩溃。我在字符串末尾缺少RET\x90NOP。在最后一个NOP 之后,您的程序将无法预料地执行任何操作。
  • DEP 代表数据执行保护。

标签: c++ c function-pointers


【解决方案1】:
  1. buf(数组名转换为指针)转换为void(*)()函数指针

    (void(*)())buf
    
  2. 通过指针调用该函数

    (function_pointer)();
    

请注意,由于operator precedence 规则,这是错误的

(void(*)()) buf() // Function call has a higher precedence over type cast

所以需要另外一对括号。

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

你说得对。

附带说明:NOP 代码也会使您的应用崩溃:没有 return 语句,并且IP 不会在该有效负载完成时恢复。

【讨论】:

  • 注意:在 C++03 和 C99 中,不允许将非函数指针强制转换为函数指针(尽管它是常见的扩展)。 C++11 正式将其设为可选。
【解决方案2】:

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

这里有一个更干净的选择:

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

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多