Exlpoits - warum C

Hallo,

ich beschäftige mich viel mit C und C++.Also alle Exploits die ich so gesehen hab waren entweder in C oder Python geschrieben.Aber warum eigentlich nicht C++,da dies doch eine Erweiterung von C ist.Ich hab auch gelesen,dass man dazu eher C und nicht C++ verwenden sollte.Aber was kann man in diesem Bereich mit C,was man mit C++ nicht könnte.
 
Da C nur eine Teilmenge von C++ ist, könnte man natürlich auch C++ verwenden. Macht nur in vielen Fällen wenig Sinn, da C++ zum Teil die Speicherverwaltung übernimmt, die man bei Exploits ja lieber selbst in der Hand haben will. Ausserdem verursacht C++ einen ziemlich grossen Overhead durch die Objektorientierung, den man sich sparen kann, da man auf C++-Funktionalitäten bei kleinen Programmen wie Exploits getrost verzichten kann.

Im Endeffekt wird man also bei Exploits die Vorzüge von C++ eh nicht nutzen, da man volle Kontrolle über String-Handling im Speicher usw. haben will.
 
Mit so starken Unterschieden was die Speicherverwaltung angeht hätte ich ja nicht gerechnet.Registrieren bei Habo hat sich jetzt schon gelohnt.Danke für die schnelle Antwort.
 
Schau dir einfach mal als Beispiel String-Handling in C an und String-Handling in C++. Während man in C Character-Arrays verwendet, die man selbst allozieren muss, nutzt man in C++ ein String-Objekt, das komplett die Speicher-Verwaltung übernimmt. Während man in C Outputs mit printf()-Funktionalitäten macht, verwendet man in C++ Streams, die sich um Formatierungen kümmern. usw. usf. C++ nimmt dir also eine Menge Speicher-Verwaltung ab und mit C++-Objekten ist ein direkter Zugriff auf Speicher-Bereiche daher etwas umständlicher oder man verwendet in seinen C++-Source dann doch wieder C-Elemente dafür.
 
Das stimmt nicht so ganz. Mit der (Kontrolle der) Speicherverwaltung hat das nichts zu tun, denn dann würde es überhaupt keine Sinn machen Exploits in Scriptsprachen zu schreiben. Es hängt vielmehr mit Punkten wie:

  • Welche Sprache(n) beherrscht der Entwickler/zieht er vor
  • Welche Sprache eignet sich am besten, um den Angriff durchzuführen, mit C/C++/Pyhton kommt man bei einem Webbrowser idR nicht sehr weit, also wird hier JavaScript/ActionScript genutzt, andersherum wird es schwierig mit JS im Betriebssystem irgendetwas zu machen
  • Welche Bibliotheken die Sprache bietet
Im Prinzip macht es relativ wenig Sinn keine Scriptsprache zu benutzen, da das Kompilieren/Stringhandling während des Entwicklungsprozesses zu viel Zeit in Anspruch nimmt. Es hat schon seinen Grund, warum msf in einer Scriptsprache und nicht C geschrieben ist.
 
Bei einer Skript-Sprache hast du nur das Problem, dass ein ordentliches Debugging nicht möglich ist, was wiederum das Einschleusen von Code enorm erschweren kann. Python, Ruby und Perl sind in dieser Hinsicht ziemlich Ausnahmen.

Ausserdem scheint's dem TE eher um Programm-Exploits zu gehen, die auf Programme losgelassen werden und nicht auf Websites o.ä. "Subprogramme", die durch Server bereit gestellt werden. Aber es stimmt schon... der Begriff "Exploit" ist sehr weitläufig. Beim Exploiten von Programmen werden aber eher seltener Skript-Sprachen eingesetzt.

Im übrigen ist das MSF nicht in einer Skript-Sprache geschrieben. Nur weil die Interfaces in Ruby sind, heisst das noch lange nicht, dass das auch beim Rest der Fall ist. Schau dir Elemente wie den Meterpreter, Exe-Templates, CPU-Info-Tools, dllinject, memdump oder ipwn im MSF an. Alles in C geschrieben. Manche Dinge bekommt man mit Skript-Sprachen einfach nicht hin bzw. muss sich auf einige wenige Skript-Sprachen, die entsprechende Funktionalitäten bieten, beschränken oder starke Performance-Verluste in Kauf nehmen, was wiederum den Vorteil der durch's Nicht-Kompilieren gesparten Zeit negiert. Mal davon abgesehen, dass auf heutigen CPUs das Kompilieren von Exploits kaum länger dauert als der Aufruf eines Interpreters.
 
Bei einer Skript-Sprache hast du nur das Problem, dass ein ordentliches Debugging nicht möglich ist, was wiederum das Einschleusen von Code enorm erschweren kann. Python, Ruby und Perl sind in dieser Hinsicht ziemlich Ausnahmen.
Debuggen musst du nur das Programm, welches die Sicherheitslücke aufweist und da hast du nicht so die Auswahl, was die Sprache betrifft ;)

Ausserdem scheint's dem TE eher um Programm-Exploits zu gehen, die auf Programme losgelassen werden und nicht auf Websites o.ä. "Subprogramme", die durch Server bereit gestellt werden. Aber es stimmt schon... der Begriff "Exploit" ist sehr weitläufig. Beim Exploiten von Programmen werden aber eher seltener Skript-Sprachen eingesetzt.
Nein, http://dev.metasploit.com/redmine/projects/framework/repository/entry/modules/exploits/windows/

Im übrigen ist das MSF nicht in einer Skript-Sprache geschrieben. Nur weil die Interfaces in Ruby sind, heisst das noch lange nicht, dass das auch beim Rest der Fall ist. Schau dir Elemente wie den Meterpreter, Exe-Templates, CPU-Info-Tools, dllinject, memdump oder ipwn im MSF an. Alles in C geschrieben. Manche Dinge bekommt man mit Skript-Sprachen einfach nicht hin [...]
Genau, aber man beschränkt sich darauf. Sprich alles was näher mit dem OS interagieren muss, wird in C geschrieben, um einen Overflow zu triggern und ROP/Shellcode zu injecten braucht man aber kein C, sondern lediglich eine Skriptsprache, die das betreffende Interface ansteuern kann.


Mal davon abgesehen, dass auf heutigen CPUs das Kompilieren von Exploits kaum länger dauert als der Aufruf eines Interpreters.
Ja, die Zeit zum Kompilieren bzgl. der CPU ist wirklich vernachlässigbar, nicht aber die Zeit, die ein Entwickler braucht um ein korrektes Programm zu erstellen. Die C-Syntax ist wesentlich komplexer als die einer Skriptsprache, weiter stehen für Skriptsprachen wesentlich mehr Bibliotheken zur Verfügung, die wesentlich leichter einzubinden sind, sodass das Base64 kodieren innerhalb von 2 Zeilen gemacht ist - in C mind. das 5-Fache.
 
Na das waren ja schon n paar Argumente hier.Ich dachte immer msf wäre in C geschrieben.Ich hatte grundsätzlich schon immer Entscheidungsprobleme zwischen C und C++.Python hab ich mir mal vor etwas längerer Zeit angeschaut.Bitmuncher hat schon recht,ich dachte daran die Exploits eher auf Programme/Spiele zu hetzen(Trainer).Bei xrayns Link waren jedoch viele Beispiele in Ruby,jedoch habe ich mir Ruby nie angeschaut.Bei mir kommts nicht so sehr auf den Aufwand einer Sprache an,sondern mehr auf Funktionalität und Einsetzbarkeit.
 
Bitmuncher hat schon recht,ich dachte daran die Exploits eher auf Programme/Spiele zu hetzen(Trainer).
Nun muss ich meinen Hut vor Bit ziehen, der anscheinend die Gedanken anderer Leute lesen kann, das war kaum anhand der Fragestellung festzumachen - mit Exploits bezeichnet man im Allgemeinen aber eher Programme/Skripte, die Sicherheitslücken anderer Programme ausnutzen. Das was du vorhast geht eher in den Bereich Datenmanipulation/Malware und dafür eignet sich C hervorragend.
 
Debuggen musst du nur das Programm, welches die Sicherheitslücke aufweist und da hast du nicht so die Auswahl, was die Sprache betrifft ;)
Ich musste auch schon Exploits debuggen um genau nachvollziehen zu können ob sie das erwartete tun. Von Blind-Attacken mal abgesehen, deren Erfolg sich ja zumeist nur anhand von Response-Zeiten messen lassen, was mit kaum einer Skript-Sprache genau genug möglich ist.

Genau, aber man beschränkt sich darauf. Sprich alles was näher mit dem OS interagieren muss, wird in C geschrieben, um einen Overflow zu triggern und ROP/Shellcode zu injecten braucht man aber kein C, sondern lediglich eine Skriptsprache, die das betreffende Interface ansteuern kann.
Nur dass Overflow-Exploits heutzutage eher seltener sind und wenn sie auftreten dann wesentlich komplexer sind als nur ein einfaches Overflow auslösen. Aber selbst im berühmten "Smashing the stack for fun and profit" von Aleph1 finden sich Dinge wie

Code:
long get_esp(void){
  __asm__("movl %esp,%eax\n");
}

Sowas dürfte in einer Skript-Sprache eher schwierig werden.

Btw:
Code:
bitmuncher@mbp2:~/Downloads/msf3> find . -name *.c |wc -l
    1002


Ja, die Zeit zum Kompilieren bzgl. der CPU ist wirklich vernachlässigbar, nicht aber die Zeit, die ein Entwickler braucht um ein korrektes Programm zu erstellen. Die C-Syntax ist wesentlich komplexer als die einer Skriptsprache, weiter stehen für Skriptsprachen wesentlich mehr Bibliotheken zur Verfügung, die wesentlich leichter einzubinden sind, sodass das Base64 kodieren innerhalb von 2 Zeilen gemacht ist - in C mind. das 5-Fache.

Inwiefern eine Syntax als komplexer empfunden wird, dürfte eher Geschmackssache sein. Die meisten Programmier- und Skriptsprachen beinhalten die meisten Elemente von C auch. Lediglich das Speicher-Management wird einem bei Skripten abgenommen, was zulasten der Performance geht und gerade bei lokalen Exploits sind Skripte nur bedingt einsetzbar. Bei Remote-Exploits, wo eh zumeist nur Zeichenketten durch die Gegend geschickt werden, bieten sich Skripte natürlich an, wobei man auch dort oft schon an die ersten Grenzen stösst, wenn man Netzwerk-Pakete selbst zusammen bauen muss um zum Ziel zu kommen.

@St3lthy0veRflow: Bei Cracks und Trainern, die übrigens rechtlich sehr in einer Grauzone sind, wenn du sie verbreitest und nicht nur privat einsetzt, werden dir Skript-Sprachen nur bedingt weiterhelfen. Natürlich gibt es auch Programme, die irgendwelche Skript-Engines für bestimmte Funktionen nutzen, aber zumeist wirst du direkt in Progammabläufe eingreifen müssen oder Binärformate manipulieren.
 
Zurück
Oben