int (*func)(); ???
-
Hallo eine frage was ist das hier ??
Eine Funktion wo ein Pointer drauf ist ??
int (*func)();
Und denn Teil hier versteh ich auch irgendwie noch nicht so wirklich.
Kann mir das wer plz erklären ?
func = (int (*) () ) code;
Wenn ja würde das nicht auch so gehen ?
int *func)();
Also hier ist mal das Komplette Programm
Der shellcode ruft einfach nur den Sleep Befehl auf.
char code[] = "\x31\xc0\xbb\x42\x24\x80\x7c\x66\xb8\x88\x13\x50\xff\xd3"; int main(int argc, char **argv) { int (*func)(); func = (int (*)()) code; (int)(*func)(); }
-
Das ist ein Cast. Eigentlich ja genau das gleiche, wie:
float foo = 2.0f; int b = (int) foo;Darum die Klammern da.
-
func = (int (*)()) code;bedeutet man nehme den pointer von code und interpretiere ihn als eine Funktion mit Rückgabetyp int und ohne Parameter.
(Rückgabetyp (*) (typ parameter, ...) zuInterpretierenderPointer.int (*func)();ist eine Funktionsdeklaration. Quasi dasselbe wie
int func();Die Variable func soll ein Pointer auf eine Funktion sein, die ein int zurückgibt und keine Parameter annimmt.
Ich habe keine Ahnung was
(int)(*func)();bedeuten soll, ein Compiler auch nicht soweit ich das überblicke.
-
Also ist das
float foo = 2.0f;das gleich wie
int b = (int) foo;Und wenn ja wieso steht dann da 1 mal int und nicht 2 mal float
-
Nein, nein. Die Klammern sind da, weil es ein Cast sein soll. Das andere ist ja nur ein Beispiel von einem expliziten Cast, den man eigentlich kennen sollte.
Siehe auch:
http://www.cplusplus.com/doc/tutorial/typecasting/
-
ok ty ich werds mal durcharbeiten.
-
mr_point schrieb:
int (*func)();
func ist uninitialisierter Zeiger vom Typ "Zeiger auf eine parameterlose Funktion, die int zurückgibt".
mr_point schrieb:
func = (int (*) () ) code;
C-style cast.
mr_point schrieb:
Also hier ist mal das Komplette Programm
Der shellcode ruft einfach nur den Sleep Befehl auf.char code[] = "\x31\xc0\xbb\x42\x24\x80\x7c\x66\xb8\x88\x13\x50\xff\xd3"; int main(int argc, char **argv) { int (*func)(); func = (int (*)()) code; (int)(*func)(); }Das ist ganz großer Käse! Laut C++ Standard "undefiniertes Verhalten", weil Du einem Funktionszeiger keine Adresse einer Funktion vom richtigen Typ zuweist und versuchst die "Funktion" aufzurufen. Auf modernen Systemen wird das Betriebssystem den Prozess einfach abschießen, weil üblicherweise das Betriebssystem nicht das Ausführen von im Datensegment befindlichen Code erlaubt.
Gruß,
SP