((void (*)())buf)(); 是做什么的?意思?

What does ((void (*)())buf)(); mean?

我正在 picoCTF 上解决二进制漏洞利用挑战并遇到了这段代码:

((void (*)())buf)();

其中 buf 是一个字符数组。

我解决了挑战,但似乎无法理解它到底在做什么。我查看了 this 话题,但我看不懂。

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

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

void (*)() 是一种类型,类型为 "pointer to function that takes indeterminate arguments and returns no value".

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

(void (*)())bufbuf 转换为上述类型。

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

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

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

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

一个解释:

那"character array"其实就是一个机器码数组。当您将数组转换为 void (*)() 并调用它时,它会在数组内部运行机器码。如果您提供数组的内容,我可以为您拆解它并告诉您它在做什么。