WikiDer > Pufferüberlauf

Bufferoverloop

EIN Pufferüberlauf (Englisch: Pufferüberlauf) ist ein Name für zwei Probleme, die bei Computern auftreten können.

  • Daten fließen schneller ein, als sie verarbeitet werden können.
  • Daten werden in a . geschrieben Puffer was dafür zu klein ist. Dies führt normalerweise zu unvorhersehbaren Problemen im Programmbetrieb, es sei denn, der Pufferüberlauf wird sorgfältig entworfen, um einen bestimmten Effekt zu erzielen.

Das erste Problem kann auftreten, wenn ein Gerät (z. B. ein Computer) Daten an ein anderes Gerät (z. B. einen Drucker) sendet. Der Drucker kann die empfangenen Daten vor dem Drucken zwischenspeichern, aber die Puffergröße ist begrenzt. Bei der seriellen Kommunikation ist es üblich, dass der Empfänger dem Sender mit ^Q und ^S mitteilt, dass die Übertragung angehalten werden soll.

Das zweite Problem entsteht, wenn ein Puffer begrenzter Größe deklariert wird, in dem Daten zeilenweise gelesen werden, wenn sich herausstellt, dass eine Zeile länger ist als der Puffer. In einem solchen Fall sorgt ein gut geschriebenes Programm dafür, dass die Leitung beim Empfang geteilt wird.

Fehler in solchen Programmen, außerdem bei Betriebssysteme, werden manchmal missbraucht von Würmer, Viren und Hacker um sich unbefugten Zugriff auf Computersysteme zu verschaffen.

Geschichte

Einer der ersten Texte über den Pufferüberlauf, "Smashing the stack for fun and profit", wurde geschrieben von Alef Eins, in dem EzinePhrack. Es erklärt, wie man ein schlecht geschriebenes . verwendet CProgramm kann den Puffer überlaufen und die Kontrolle über die Programm kann durch Manipulation der Stapel.

Auswirkungen

Bei einem Pufferüberlauf werden Daten überschrieben, die nicht überschrieben werden sollen, insbesondere die Rücksprungadresse. Das führt im besten Fall zu einem ProgrammAbsturz, schlimmstenfalls dazu, vom Programm von etwas übernommen zu werden, das dem Programm Daten zur Verfügung stellt. Es ist daher wichtig, Programme zu erstellen, die keinen Pufferüberlauf verursachen.

Ursachen

Die Ursache eines Pufferüberlaufs lässt sich am besten mit Beispielcode in C veranschaulichen:

#include void main(int argc, char *argv[]){ char big_buffer [1024]; // Puffer von 1024 Bytes fgets(big_buffer, 1024, stdin); // String von Tastatur abrufen, maximal 1024 Zeichen overflow(large_buffer); // angreifbare Funktion aufrufen}void overflow(char *large){ char anfällig[100]; // Pufferüberlauf [100 Byte] strcpy(vulnerable,large); // Kopiere large_buffer in den anfälligen Return; // Funktion beenden }

Der obige Codeabschnitt führt die folgenden Aktionen aus:

  1. Tastatureingaben in large_buffer lesen
  2. Funktionsüberlauf aufrufen
  3. Eingabe an angreifbare Stelle kopieren (100 Byte)
  4. Exit-Funktion
  5. Programm beenden

Der Fehler ist in Schritt 3. Weil big_buffer ist größer als verletzlich, beim Kopieren der Teil von big_buffer das nicht in verletzlich passt dahinter verletzlich geschrieben sein. Dies fällt nur auf, wenn die Tastatureingabe größer als 100 Byte ist.

weil verletzlich ist keine globale Variable, sie wird auf den Wert gesetzt Stapel Gerettet. Und dahinter verletzlich ist die Rücksendeadresse der Funktion Überlauf. Dies ist eine Zahl, die angibt, wohin zurückgekehrt werden soll, wenn die Funktion beendet ist. Wenn Sie beispielsweise 200 a eingeben, wird versucht, zur Adresse 0x61616161 zurückzuspringen (61 ist die hexadezimale Darstellung von "a").

Missbrauch

Das erfolgreiche Ausnutzen eines Pufferüberlaufs erfordert die Ausführung von proprietärem Code, der manchmal als „Ei“ bezeichnet wird. Dieser Code kann beispielsweise in der Tastatureingabe enthalten sein. Es ist jedoch schwierig, die Position der Eingabe auf dem Stapel zu bestimmen. Dafür gibt es jedoch eine Lösung: Nach der Rückgabe der Funktion wird die Stapel Zeiger (esp) nach der Adresse, wo die Rücksendeadresse war. Wenn Sie also den Code nach der Rücksendeadresse einfügen und die Rücksendeadresse auf einen jmp esp/call esp verweisen, wird der Code ausgeführt.

Zu erfüllende Kriterien

Die Rücksendeadresse muss natürlich an der richtigen Stelle stehen. Am einfachsten ist es, eine Folge aufeinanderfolgender Zeichen (abcdefg...) zu verwenden und dann zu sehen, worauf es zurückkommt. Natürlich muss der Code auch etwas Sinnvolles leisten; am häufigsten ist ein sogenanntes Shell-Code die dem Exploit eine Kommandozeilenschnittstelle zur Verfügung stellt, um das System zu kontrollieren.

Die Rücksendeadresse und die Shell-Code beide dürfen nicht die Zahlen 0x00, 0x0A, 0x0C und 0x1A enthalten, da das Kopieren von Strings hier stoppt.

Aussehen

Ein Pufferüberlauf kann vermieden werden, indem die maximale Länge der zu kopierenden Zeichenfolgen vor dem Schreiben von Daten überprüft wird.

Siehe auch