【发布时间】:2020-05-01 05:12:35
【问题描述】:
我正在解决 picoCTF 上的二进制利用挑战,并遇到了这段代码:
((void (*)())buf)();
其中buf 是一个字符数组。
我解决了挑战,但似乎无法理解它到底在做什么。我查看了this 线程,但看不出来。
((void (*)())buf)(); 是什么意思?
【问题讨论】:
-
((void (*)())buf)();是什么意思? 表示作者不懂typedef。typedef void (*voidFuncPtrType)();将使这段代码清晰。 -
@AndrewHenle 在设计 CTF 挑战时,清晰并不是真正的首要目标,甚至可以预期一些混淆作为挑战的一部分。作者很可能意识到这不是最易读的做事方式。
-
说明你的程序有UB。
-
这意味着C的“螺旋”类型声明规则太复杂了。几乎所有其他并非直接源自 C 的静态类型语言都使用从左到右的规则是有原因的。
-
@MasonWheeler “螺旋”是一个都市神话。该声明与相应的表达式一样多或少“螺旋”。运算符只是按优先级和从左到右的顺序应用(当然,这里没有告诉你任何新内容):“我需要取消引用它,然后调用它,结果类型为 void”:瞧,指向 void 函数的指针.
标签: c function pointers function-pointers