Frage zum Aufbau bzw. Funktion dieses Code Snippets
-
Hallo liebe Community,
ich beschäftige mich zur Zeit mit C und lerne sehr eifrig.
In diesem Zusammenhang lese ich sehr viel Source anderer Programmierer.
Mit Hilfe von Google und Büchern, kann ich mir meistens selbst helfen, falls ich etwas nicht so ganz verstanden habe.
Nun bin ich allerdings auf folgendes Snippet gestoßen, welches ich beim besten Willen nicht "entschlüsseln" kann.char code[] = "paste your shellcode here"; int main(int argc, char **argv) { int (*func)(); func = (int (*)()) code; (int)(*func)(); }
Was macht dieses Programm im Detail?
Ich kann mir leider nicht so richtig selbst helfen, da ich durch die (für mich) kompliziert aussehende Klammerung nicht durchsteige.
Ich würde mich wirklich sehr freuen, wenn mir ein Spezialist erklären könnte, was dieser Code denn eigentlich macht.
Ich weiß, dass dieser Code einen Shellcode ausführt und z.B. einen Calc.exe starten lassen kann, aber ich verstehe nicht, warum es das tut.Vielen Dank schon einmal vorab und viele Grüße,
Stefan
-
*func ist ein Zeiger auf eine Funktion.
Dieser zeigt durch den zweiten Aufruf auf code[], dort steht quasi dissassemblierter code drin (ist zumindest so vorgesehen).
Im dritten Schritt wird die Funktion, auf die func zeigt aufgerufen, also der Code, der in code[] steht, ausgeführt.
-
int (*func)(); // Deklaration der Variablen 'func' als eine Funktion ohne Parameter und Rückgabetyp 'int' func = (int (*)()) code; // Zuweisung der Variablen 'code' (mit entsprechendem Funktions-Cast) an 'func' (int)(*func)(); // Aufruf der Funktion 'func' und unnötigerweise casten auf 'int'
geht aber auch kürzer:
int (*func)() = (int (*)()) code; (*func)();
oder aber mittels 'typedef':
typedef int (*Func)(); Func func = (Func)code; (*func)();
-
Th69 schrieb:
geht aber auch kürzer:
int (*func)() = (int (*)()) code; (*func)();
Sogar
int (*func)() = (int (*)()) code; func();
-
Vielen Dank für die informativen Antworten.
Ein Funktions-Cast habe ich bisher noch nicht gehört.
Ist das ein gängiges Prozedere in C?
Es wunder mich, dass ich davon noch nichts gehört habe.Normale Casts verstehe ich - eine Typenumwandlung, aber unter einem Funktions-Cast, kann ich mir spontan nichts vorstellen.
Ich werde mal eine Runde Google bemühen.Könnte man in diesem Fall auch folgendes schreiben:
int *func() = (int (*)()) code; *func();
Warum muss man in diesem Fall scheinbar die Klammern um den Funktionszeiger *func() beibehalten?
Liebe Grüße,
Stefan
-
Stefan123 schrieb:
Ein Funktions-Cast habe ich bisher noch nicht gehört.
Ich auch nicht. Hier wird ein char-Zeiger in einen Funktionszeiger gecastet.
Ist das ein gängiges Prozedere in C?
Nur für Hacks und Exploits schätze ich
int *func() = (int (*)()) code; *func();
Warum muss man in diesem Fall scheinbar die Klammern um den Funktionszeiger *func() beibehalten?
Man muss entweder den Funktionszeiger dereferenzieren und die sich ergebende Funktion aufrufen:
(*func)();
oder ausnutzen, dass das sowieso bei jedem Funktionsaufruf passiert, und kurz
func();
schreiben.
*func();
wäre falsch, das bedeutet: Rufe die Funktion, die hinter dem Zeiger func liegt, auf, und dereferenziere das Ergebnis. Das ist unnütz oder falsch, je nachdem, ob func einen Zeiger aus Rückgabetyp hat.