[DE] Bufferoverflow - Die Theorie

in #deutsch7 years ago

Bei einem Bufferoverflow oder Pufferüberlauf werden Daten, die oftmals als Benutzereingaben eingelesen werden, in einen Speicherbereich geschrieben, der nicht dafür gedacht war. Indem größere Datenmengen als eigentlich vom Entwickler dafür reserviert eingelesen werden, "läuft" dieser "über" und wird auf den entsprechenden nächsten Bereich geschrieben.


D1ED1184-8C1E-4DDD-BF10-FB8E233FC1E8.jpeg
Quelle

Vorallem Programmiersprachen, die weitestgehend direkt in Machinencode kompiliert werden sind bei Programmierfehlern anfällig (z.B C/C++ etc.). Bei diesen Sprachen ist der Entwickler selbst für die Prüfung der Speicherbereiche verantwortlich. Das ist einer der Gründe, warum bereits vorhandene Algoithmen (die sich bewährt haben) nicht neu entwickelt werden sollten.
Java oder Pyhton sowie andere Hochsprachen nutzen Kontrollstrukturen des Betriebssystems, die solche Speicherüberläufe detektieren und vermeiden können.

Prinzipiell unterscheidet man zwischen Stack- und Heap-Overflows. Also dynamisch alloziertem und statischem Speicher.

In diesem Minimalbeispiel möchte ich mich auf einen Stack-Overflow beschränken.

void stack_overflow(const char *foo)
{
    char bar[7];
    strcpy(bar, foo);
}

Wird die Funktion nun aufgerufen:

stack_overflow("abcdefghij")

So ergibt sich ein Buffer Overflow, da nicht genug Speicher für bar[] allokiert wurde. Die Funktion strcpy(), die in diesem Fall unsere Eingabe in bar[] kopiert ist ein Beispiel für eine Funktion die oft zu Überläufen führen kann, wenn nicht auf die Grenzen geachtet wird.

Frage an die Kenner: Warum würde der Aufruf der Methode mit "steemit" als Parameter auch zu einem Buffer-Overflow führen ?

Abhängig von dem ensprechenden Programm kann dieses dabei abstürzen und ein weitestgehend unkontrolliertes Verhalten aufweisen.

Wird ein Bufferoverflow absichtlich erzeugt, so meist in der Absicht Code auf dem Zielsystem auszuführen. Die Ausführungsprivilegien entsprechen hierbei denen, des betroffenen Prozesses. Dies kann erreicht werden, indem Sprungadressen im Speicher abgelegt werden, die auf andere Speicherbereiche verweisen. So kann beispielsweise eine Rücksprungadresse auf eine Funktion diese ausführen.


Ich werde zeitnah einen ausführlichen Beitrag mit einem Beispiel schreiben.

Vielen Dank fürs Lesen !

Sort:  

Gut erklärt, das Beispiele ist auch gut gewählt.
Der FTP-Server von Filezilla wird ja heute noch verwendet als Beispiel.
Da fand ich deinen anschaulichen Code wesentlich besser.
Ein Kommentar wäre noch schön gewesen dann wäre es perfekt.
Zu deiner Frage, steemit sollte eigentlich funktionieren, da ja genug platz da ist mit 7 Bytes.

Dankesehr !
Mit einem Beispiel in dem die Vorgehensweise Stück für Stück erklärt wird, sollte es noch anschaulicher werden :)

Oben handelt es sich um C Code - das hätte ich dazu schreiben sollen. Dort führt es zu einem BoF.

Strings werden in C mit einem null char('\0') abgeschlossen dahers ist der String 8 Byte lang.