我正在解决picoCTF的二进制利用挑战,并遇到了这段代码:
((void (*)())buf)();
buf
字符数组在哪里。
我解决了挑战,但似乎无法理解它到底在做什么。我看了看这个线程,但是我听不清。
什么((void (*)())buf)();
意思
@AndrewHenle在设计CTF挑战时,清晰度并不是真正的首要目标,甚至有些困惑也可以作为挑战的一部分。作者很可能意识到这不是最易读的做事方式。
—
ManfP
这意味着您的程序具有UB。
—
R .. GitHub停止帮助ICE
这意味着C的“螺旋”类型声明规则太复杂了。几乎所有其他并非直接来自C的静态类型语言都使用从左到右的规则,这是有原因的。
—
梅森惠勒
@MasonWheeler“螺旋”是一个城市神话。该声明与相应的表达式一样多或少“螺旋”。运算符仅按优先级和从左到右的顺序应用(当然,这里没有告诉您任何新内容):“我需要取消引用,然后调用它,并且结果的类型为void”:瞧,指向void函数的指针。
—
彼得-
((void (*)())buf)();
意思 这意味着作者不理解typedef
。typedef void (*voidFuncPtrType)();
将使代码清晰。