什么 ((void (*)())buf)(); 意思?

sh.*_*.ll 59 c pointers function-pointers function

我正在解决 picoCTF 上的二进制开发挑战,并遇到了这段代码:

((void (*)())buf)();
Run Code Online (Sandbox Code Playgroud)

哪里buf是字符数组。

我解决了挑战,但似乎无法理解它到底在做什么。我看着这个线程,但我无法理解。

什么((void (*)())buf)();意思?

Som*_*ude 132

void (*)() 是一种类型,该类型是“指向采用不确定参数且不返回值的函数的指针”。

(void (*)()) 是上述类型的类型转换。

(void (*)())buf强制转换buf为上述类型。

((void (*)())buf)() 调用函数(不传递参数)。

简而言之:它告诉编译器将其buf视为指向函数的指针,并调用该函数。

  • 我发现 `cdecl` 实用程序(或[网站](http://cdecl.org))有助于将更复杂的 C 表达式翻译成英语。 (15认同)
  • @AvD如果“buf”或“copy”所在的位置位于可执行地址并且代码本身与位置无关,则这将起作用。当然,它是不可移植的,但这应该适用于许多裸机环境以及未在堆栈和堆上设置禁止执行 (NX) 位的较旧 x86 操作系统。 (5认同)
  • @AvD:它不一定会崩溃。除非数据区域受到保护以防止执行(这取决于体系结构和运行时环境),否则您可以使用此技巧在运行时将函数编译为数组并动态调用它。35 年前,我第一次在 DEC Vax 上使用这个技巧来编译图灵机,以进行图灵机进化的失败实验。 (4认同)
  • @bta cdecl 在这里没有用,因为语法不是声明。这是通过对先前声明的符号进行强制转换的函数调用 (3认同)
  • @bolov - 在整个声明中,不,但它*确实*解释了它的[最复杂的部分](https://cdecl.org/?q=%28void+%28*%29%28%29%29buf) 。从这里开始,解码其余部分就相当简单了。 (3认同)

P__*_*J__ 11

指针buf被转换为指向 void 函数的指针,该函数采用未指定数量的参数,然后取消引用(即调用函数)。


luk*_*keg 9

这是一个类型转换,然后是一个函数调用。首先,buf被转换为指向返回 的函数的指针void。最后一对括号表示该函数随后被调用。


JL2*_*210 7

它将字符数组转换为指向不带参数并返回 的函数的指针void,然后调用它。由于函数指针的工作方式,不需要取消引用指针。

一个解释:

那个“字符数组”实际上是一个机器码数组。当您将数组转换为 avoid (*)()并调用它时,它会在数组内运行机器代码。如果你提供了数组的内容,我可以为你拆解它并告诉你它在做什么。