【发布时间】: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。\x90是NOP。在最后一个NOP之后,您的程序将无法预料地执行任何操作。 -
DEP 代表数据执行保护。
标签: c++ c function-pointers