Funktionszeiger und Shellcode
-
Hio,
Ich habe ein kleines Problem mit Funktionszeigern. Ich möchte innerhalb meines Programmes reinen Shellcode ausführen. Dazu habe ich folgendes Beispiel gefunden:char shellcode[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0" "\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d" "\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73" "\x68"; int main() { void (*fp)() = shellcode; fp(); return 0; }gcc meckert mit: Fehler: »char*« kann nicht nach »void (*)()« in initialization umgewandelt werden.
Das verstehe ich nicht ganze. Eigentlich sollte fp ein Zeiger auf eine Funktion sein, die keine Parameter braucht und auch keine zurückgibt. Und diese Funktion liegt halt als shellcode im Programm vor.Wo liegt da der Fehler?
Gruß
Pille
-
Huh?
fpist ein Funktionszeiger,shellcodehingegen ein Array auschar. Ein Array auscharist keine Funktion, folglich kann auch kein Funktionszeiger darauf zeigen. Du könntestshellcodeeventuell casten, jedoch denke ich nicht, dass das so eine gute Idee ist. Hast Du keinen ASM von dem shellcode? Oder geht es Dir um Obfuscation?
-
Hmm naja die Theorie ist ja diese dahinter:
Shellcode ist irgendein gültiger, ausführbarer Code sobald dieser im Speicher landet. Das dieser im C++ Programm in dieser Form mit Opcodes vorliegt ist ja dem Speicher egal, im Speicher sind alle Daten gleich.
Nun muss ich C++ ja nur noch irgendwie sagen "führe das aus, wan an der Stelle steht wo du Shellcode abgelegt hast".
Und dazu wollte ich halt einen Funktionszeiger auf diese Speicherstelle nutzen, die halt genau auf Shellcode zeigt. Sprich genau die dortige Funktion ausführt.Bestimmt ist das 1000mal einfacher mit inline Assembler etc. zu realisieren,aber hier geht es gerade weniger um eine praktische Anwendung, sondern eher zum Verstehen von Shellcodes und deren nutzen.
-
natürlich ist das möglich. das man dir wenigstens die richtige antwort
im ersten post nicht gegeben hat. tzzz...void (*fp)() = reinterpret_cast<void(*)()>(shellcode);einfach reincasten

-
Nonono, not possible, geht das nicht:
There is no context in which this conversion is possible
-
Kenn0r@Ausland schrieb:
Nonono, not possible, geht das nicht:
There is no context in which this conversion is possible
Das sagt wer?
Ich denke auch, daß das geht.
-
el visual estudio 2008
-
keksdose2 schrieb:
natürlich ist das möglich. das man dir wenigstens die richtige antwort im ersten post nicht gegeben hat. tzzz...
Hatte ja nicht direkt erwartet, eine Antwort zu bekommen die sofort richtig ist, wollte aber auch klar machen in welche Richtung die Antwort gehen sollte

Mal ganz nebenbei, gcc/g++ schluckt das anstandslos - danke!
-
Afaik geht das nicht, also Datenzeiger auf Codezeiger zu casten (nach Standard), würde auch Sinn machen, man denke an eine Harvard-Architektur.
-
Tippgeber schrieb:
Afaik geht das nicht, also Datenzeiger auf Codezeiger zu casten (nach Standard)
Dochdoch, geht schon, ist schliesslich C++.

Man muss halt zu einer
uniongreifen. Aber ob das Sinn macht...
-
Natürlich ist das Verhalten vom Standard nicht gedeckt. Auch nicht mit union.
-
Es geht in C++ nur mit einer Uni0n.
-
char *data = 0; void (*pfunc)() = reinterpret_cast<void (*)()>(data); pfunc();ohne probleme (visual studio 08)
-
Aso, aha, also mit "char code[] = ..." gehts ned, aber mit "char* code = ..." schon.
Komisch?