私はpicoCTFでのバイナリの悪用の課題を解決しており、次のコードに遭遇しました。
((void (*)())buf)();
どこbuf
の文字列です。
私は問題を解決しましたが、それが何をしているのか正確に理解できないようです。私はこのスレッドを見ましたが、理解できませんでした。
どういう((void (*)())buf)();
意味ですか?
@AndrewHenleによるCTFチャレンジの設計では、明快さは実際の最上位の目標ではありません。チャレンジの一部として、難読化も予想されます。ほとんどの場合、著者はこれが最も読みやすい方法ではないことを認識していました。
—
ManfP
プログラムにUBがあることを意味します。
—
R .. GitHub ICE HELPING ICE
これは、Cの「スパイラル」型宣言ルールが複雑すぎることを意味しています。Cから直接派生していない、実質的に他のすべての静的型付け言語が、左から右への規則を使用するのには理由があります。
—
メイソンウィーラー
@MasonWheeler「スパイラル」は都市の神話です。宣言は、対応する表現と同じくらいまたは「スパイラル」です。演算子は、優先順位と左から右への順序で適用されます(もちろん、ここでは新しいことは何も言われません):「逆参照してから呼び出す必要があり、結果の型はvoidです」:voila、void関数へのポインター。
—
ピーター-モニカ
((void (*)())buf)();
意味ですか? それは作者が理解していないことを意味しますtypedef
。typedef void (*voidFuncPtrType)();
このコードを明確にします。