((void(*)())buf)();とは 平均?


59

私はpicoCTFでのバイナリの悪用の課題を解決しており、次のコードに遭遇しました。

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

どこbufの文字列です。

私は問題を解決しましたが、それが何をしているのか正確に理解できないようです。私はこのスレッドを見ましたが理解できませんでした。

どういう((void (*)())buf)();意味ですか?


14
どういう((void (*)())buf)();意味ですか? それは作者が理解していないことを意味しますtypedeftypedef void (*voidFuncPtrType)();このコードを明確にします。
Andrew Henle

33
@AndrewHenleによるCTFチャレンジの設計では、明快さは実際の最上位の目標ではありません。チャレンジの一部として、難読化も予想されます。ほとんどの場合、著者はこれが最も読みやすい方法ではないことを認識していました。
ManfP

2
プログラムにUBがあることを意味します。
R .. GitHub ICE HELPING ICE

4
これは、Cの「スパイラル」型宣言ルールが複雑すぎることを意味しています。Cから直接派生していない、実質的に他のすべての静的型付け言語が、左から右への規則を使用するのには理由があります。
メイソンウィーラー

2
@MasonWheeler「スパイラル」は都市の神話です。宣言は、対応する表現と同じくらいまたは「スパイラル」です。演算子は、優先順位と左から右への順序で適用されます(もちろん、ここでは新しいことは何も言われません):「逆参照してから呼び出す必要があり、結果の型はvoidです」:voila、void関数へのポインター。
ピーター-モニカ

回答:


129

void (*)() 型であり、その型は「不確定な引数を取り、値を返さない関数へのポインター」です。

(void (*)()) 上記の型への型キャストです。

(void (*)())bufbuf上記の型にキャストします。

((void (*)())buf)() 関数を呼び出します(引数を渡しません)。

つまりbuf、関数へのポインタとして扱い、その関数を呼び出すようにコンパイラーに指示します。


15
このcdeclユーティリティ(またはWebサイト)は、より複雑なC式を英語に翻訳するのに役立ちます。
bta

3
@bta cdeclは、構文が宣言ではないため、ここでは役に立ちません。これは、以前に宣言されたシンボルのキャストを介した関数呼び出しです
bolov

3
@bolov -文全体では、ありませんが、それはありません説明し、最も複雑な部分、それのを。そこから、残りのデコードはかなり簡単です。
bta

5
@AvD bufまたはcopyが実行可能アドレスにあり、コード自体が位置に依存しない場合、これは機能します。もちろん、移植性はありませんが、スタックやヒープに非実行(NX)ビットを設定しない古いx86 OSだけでなく、多くのベアメタル環境でも機能するはずです。
wrtlprnft

4
@AvD:必ずしもクラッシュするわけではありません。データ領域が実行から保護されていない限り(アーキテクチャとランタイム環境によって異なります)、このトリックを使用して、実行時に関数を配列にコンパイルし、その場で呼び出すことができます。35年前にDEC Vaxでこのトリックを最初に使用して、チューリングマシンの進化の失敗した実験のためにチューリングマシンをコンパイルしました。
TonyK

11

ポインタbufは、不特定の数のパラメータを取るvoid関数へのポインタに変換され、逆参照されます(つまり、関数が呼び出されます)。


9

これは型キャストで、その後に関数呼び出しが続きます。まず、bufを返す関数へのポインタにキャストされますvoid。括弧の最後のペアは、関数が呼び出されることを意味します。


7

文字配列を、引数を取らずにを返す関数へのポインターにキャストしてからvoid呼び出します。関数ポインターの仕組みにより、ポインターの逆参照は必要ありません。

説明:

その「文字配列」は、実際にはマシンコードの配列です。配列をaにキャストしてvoid (*)()呼び出すと、配列内のマシンコードが実行されます。配列のコンテンツを提供した場合、それを逆アセンブルして、それが何をしているのかを説明できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.