我正在解决picoCTF上的二进制攻击挑战,并发现了这段代码:

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

其中buf是一个字符array.

我解决了挑战,但似乎不能理解它到底在做什么.我看了this根线,但还是弄不清楚.

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

推荐答案

void (*)()是一种类型,该类型是"指向函数的指针,该函数接受不确定的参数且不返回任何值".

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

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

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

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

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

数据包未从DPDK端口传输到内核端口

自定义应用程序上的日志(log)轮换问题

堆栈在作用域阻塞后会被释放吗?

将 struct 变量赋给自身(通过指针取消引用)是否定义了行为?

双指针指向常量双指针的指针类型赋值不兼容

非正规化边缘毛刺

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

如何使用libgpio(d)为Raspberry Pi编译C程序?

C语言中的外部关键字

理解bzip2的BZ2_解压缩函数中的状态重新分配

如何将大写/小写土耳其字母相互转换?

从另一个宏函数调用C宏

当用C打印过多的';\n';时输出不正确

强制GCC始终加载常量(即只读),即使启用了优化

如何不断地用C读取文件?

使用 c 中的 write() 函数将非 ASCII 字符写入标准输出

C99 的 %zu 格式说明符不起作用