Was passiert bei einem buffer overflow?



  • hi,
    ich wollte mal fragen, was genau bei einem buffer overflow passiert. man liest ja ständig das es durch einen buffer overflow in software xyz möglich ist, beliebigen code mit root-rechten auszuführen. soweit ich weis, tritt ein overflow auf, wenn man in eine variable mehr reinpackt als eigentlich reindarf, also den speicherbereich übertritt. bloß wieso kann man dadurch code ausführen, bzw unter welchen Umstönden ist das möglich? und dann gibt es ja noch n buffer underflow (oder gibt es den gar net??)

    danke für eine erklärung 🙂

    grüsse steve



  • Steve03 schrieb:

    hi,
    ich wollte mal fragen, was genau bei einem buffer overflow passiert. man liest ja ständig das es durch einen buffer overflow in software xyz möglich ist, beliebigen code mit root-rechten auszuführen. soweit ich weis, tritt ein overflow auf, wenn man in eine variable mehr reinpackt als eigentlich reindarf, also den speicherbereich übertritt. bloß wieso kann man dadurch code ausführen, bzw unter welchen Umstönden ist das möglich? und dann gibt es ja noch n buffer underflow (oder gibt es den gar net??)

    danke für eine erklärung 🙂

    grüsse steve

    Bevor eine Unterroutine (Methode, Funktion, o.ä.) aufgerufen wird vom Prozessor, müssen aktuelle Prozessorregister (Speicherstellen) gesichert werden, damit die Unterroutine diese für ihre Berechnungen benutzen kann. U.a. muß auch der letzte Befehl vor der Unterroutine, bzw. der danach als nächstes auszuführende gesichert werden, damit nach dem Unterprogramm das "normale" Programm fortgeführt werden kann. Diese Sachen werden alle auf den Stack geschmissen. Dann wird das Unterprogramm aufgerufen. Alle lokalen Variablen des Unterprogramms werden auch auf den Stack angelegt. Wenn jetzt in einer davon mehr reingeschrieben wird, als eigentlich dürfte, dann landet der "Rest" z.B. in besagten gesicherten Registern oder als Adresse des IP (Instruction Pointers - der den nächsten auszuführenden Befehl speichert). Somit kann man bei einem Bufferoverflow z.B. den IP auf selbst in die Variablen gelenkte OP-Codes (Assembler-Befehle) lenken, der dann auch nach dem Unterprogramm tatsächlich von der CPU ausgeführt wird.

    Oder wenn z.B. ein Passwort in einer Variablen gespeichert wird, und eine weitere Variable zum Aufnehmen eines User-Passwortes, das der Benutzer einzugeben hat, benutzt wird. Wenn ich dann statt der 8 Bytes, die die User-Var eigentlich aufnehmen könnte, 2 x 8 Bytes "eintippe", wobei diese exakt gleich sind, besteht die Möglichkeit, daß die 2. 8-Bytes in der Variable landen, in der eigentlich das richtige Passwort steht. Nun steht aber in Richtiges-Passwort und User-Passwort exakt der selbe Wert -> ein if-Vergleich funktioniert, und eigentlich für den falschen User nicht ranzukommende Funktion wird doch ausgeführt.

    Waren jetzt ein paar Beispiele, die das Grundprinzip erläutern, sie sind technisch gesehen nicht unbedingt 100% korrekt.

    Einen Buffer-Underflow gibt's auch, allerdings nicht in dem Sinne, wie Du meinst... 😉



  • ok danke, was ist denn n buffer underflow? 🙂

    grüsse steve



  • Steve03 schrieb:

    ok danke, was ist denn n buffer underflow? 🙂

    grüsse steve

    Naja, Buffer können nicht underflowt werden, wie soll das gehen?!?
    Höchstens im übertragenen Sinne: Du erwartest mehr, als kommt...

    Variablen können höchstens over- oder underflowt werden... ein 32-Bit-int z.B., logisch... 🙂



  • gibts da auch ein codebeispiel zu
    wei ein programm einen overflow verursacht und ein anderes code einschleußt?



  • Wenn du folgendes machst:

    #include <stdio.h>
    
    int main (void) {
      int i = 0;
      i = -65536 // kleinstmöglichster Wert bei 32Bit signed Integer
      --i; // um 1 verkleinern
      printf ("%d", i);
    
      return 0;
    }
    

    Das wäre nun ein Überlauf des Integers.
    Ein Underflow gibt es meines Wissens nach nur bei Stacks.

    Nehmen wir an du hast einen Stack für 10 int elementen, bei einem Stack gibt es
    meist die Funktion push welche ein Element auf den Stack setzt und den Stackzeiger
    um 1 erhöht so dass er auf das oberste Element zeigt und eine Funktion pop welche
    das oberste Element löscht und zurückliefert.
    Nehmen wir an du setzt den Elementzeiger auf -1 (Die Position vor dem ersten
    Element des Stacks!), so macht das durchaus Sinn, da bei einem Push der Zeiger
    um eines nach oben geschoben wird und somit auf ein freies Feld zeigt und in
    dieses der Wert gesetzt wird.
    Wenn du aber nun ein pop() für einen leeren Stack aufrufst, so wird der Wert aus einem Feld vor dem eigentlichen Stack gelöscht (!) und dir etwas zurückgeliefert
    was du nie in den Stack geschoben hast.
    Du hast nun einen Stack underflow erzeugt, der Daten eines anderen Programmes
    gelöscht hat.

    Hoffe ich hab es einigermaßen verständlich erklärt. Ach und als Tipp, immer prüfen
    ob der Stack NICHT leer ist bevor pop ein Element löscht !



  • Irgendwo gabs das Thema letztens schonmal.
    Da hab ich den Link her.



  • Steve03 schrieb:

    ok danke, was ist denn n buffer underflow? 🙂

    bufferunderrun kenn ich nur vom brennen. während eines brennvorganges gehen dem brenner die daten aus, was dich meistens den rohling kostet.

    mfg



  • dass liegt daran, dass eben weniger Daten als erwartet (bzw. hier mindestens nötig um den Brennvorgang am laufen zu erhalten) geliefert werden.



  • Sovok schrieb:

    gibts da auch ein codebeispiel zu
    wei ein programm einen overflow verursacht und ein anderes code einschleußt?

    Mhhh... soll ich mal was bauen?! 😉

    Das war ja auch das Problem, weswegen es das DirectX 9.0b (!) Update gab'.
    Seit Version 8 hatte DirectXAudio wohl ein Problem mit MIDI-Dateien (wo Note für Note gespeichert wird). Beim Einlesen wurde ein Puffer nicht gecheckt.
    Das könnte man sich halt zunutze machen, indem man eine MIDI-Datei so umbastelt, daß ab einer bestimmten Länge ASM-Opcodes drin stehen, die was fieses machen...
    So könnte sich also auch bei Outlook mit Vorschau bei einer in eine HTML-Mail eingebettete MIDI was übles ergeben... 🙂
    Sehr kurios.



  • hi

    ich wunder mich immer wieder wieso man eigentlich asm code vom stack ausführen kann. Sollte doch eigentlich in einem PM OS unmöglich sein, da der doch als Stacksement / Datensegment makiert ist und somit nicht ausfürbar sein dürfte. ( auser das os baut da mächtig ..... ) soweit ich mich erinnern kann, wird doch so ein grober schnitzer vom prozessor mit einer exception geandet, oder?

    gruss Termite



  • Klick!

    NOp Codes werden ab jetzt ignoriert. und da windows mit jeder version immer mehr leistung frisst, dürfte es bald keine funktionierenden exploits mehr geben...:)

    mfg



  • @terraner

    und ich hab immer gedacht das würde auch für einen i368 aufwerts gelten. so kann man sich irren

    gruss Termite



  • @Sgt. Nukem
    ja wär klasse wenn du was kleines bauen könntest
    ein konsolentool, das nix mach außer n overflow zu verursachen und ein zweites tool, das nachvollziehbar den overflow ausnutzt

    mich interessiert nur wie das ausführen von fremdcode in der praxis aussieht


Anmelden zum Antworten