((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 (*)())buf
将 buf
转换为上述类型。
((void (*)())buf)()
调用函数(不传递参数)。
简而言之:它告诉编译器将 buf
视为指向函数的指针,并调用该函数。
这是一个类型转换,然后是一个函数调用。首先,buf
被转换为指向 returns void
的函数的指针。最后一对括号表示函数随后被调用。
它将字符数组转换为指向不带参数并返回 void
的函数的指针,然后调用它。由于函数指针的工作方式,不需要取消引用指针。
一个解释:
那"character array"其实就是一个机器码数组。当您将数组转换为 void (*)()
并调用它时,它会在数组内部运行机器码。如果您提供数组的内容,我可以为您拆解它并告诉您它在做什么。
我正在 picoCTF 上解决二进制漏洞利用挑战并遇到了这段代码:
((void (*)())buf)();
其中 buf
是一个字符数组。
我解决了挑战,但似乎无法理解它到底在做什么。我查看了 this 话题,但我看不懂。
((void (*)())buf)();
是什么意思?
指针buf
被转换为指向未指定数量参数的void函数的指针,然后取消引用(即调用函数)。
void (*)()
是一种类型,类型为 "pointer to function that takes indeterminate arguments and returns no value".
(void (*)())
是上述类型的类型转换。
(void (*)())buf
将 buf
转换为上述类型。
((void (*)())buf)()
调用函数(不传递参数)。
简而言之:它告诉编译器将 buf
视为指向函数的指针,并调用该函数。
这是一个类型转换,然后是一个函数调用。首先,buf
被转换为指向 returns void
的函数的指针。最后一对括号表示函数随后被调用。
它将字符数组转换为指向不带参数并返回 void
的函数的指针,然后调用它。由于函数指针的工作方式,不需要取消引用指针。
一个解释:
那"character array"其实就是一个机器码数组。当您将数组转换为 void (*)()
并调用它时,它会在数组内部运行机器码。如果您提供数组的内容,我可以为您拆解它并告诉您它在做什么。