Buffer (/Heap) Overflows gezielt ausnutzen?



  • Hallo,

    ich frage mich, ob man mit Einsehung des Quellcodes, gezielt Dinge wie Buffer-Overflows oder auch Heap-Overflows ausnutzen kann.
    Kann ich zum Beispiel gezielt eine der Variablen überschreiben? Wenn ich zum Beispiel sehe, dass ein array deklaiert wird und irgendeine Variable foo.

    Sagen wir mal foo dient als boolean zur Überprüfung von einer Passwort-Eingabe. Kann ich, wenn es der Quellcode hergibt (richtige Reihenfolge oder was auch immer nötig ist) definitiv gezielt diese Variable foo durch Ausnutzung einer Buffer-Overflow-Sicherheitslücke überschreiben?

    Was müsste dafür gelten?


  • Mod

    Wenn du den Quellcode hast, und mit exakt dem gleichen Compiler und exakt den gleichen Einstellungen das komplette Programm übersetzt, und keinerlei Sicherungsmechanismen im Spiel sind, dann kannst du mit akzeptablen Aufwand Aussagen darüber treffen, welche Variable wo genau liegt. Und davon kannst du dir dann ein Eis kaufen, denn das bringt dir herzlich wenig, denn du willst doch eigentlich deinen Exploitcode einzuschleusen und nicht bloß irgendwelche Variable ändern.

    Falls es also darum geht, ob das Veröffentlichen von Quelltext ein Sicherheitsrisiko darstellt: Nicht wirklich, weil obiges Szenario reichlich hypothetisch ist und dem Angreifer zudem herzlich wenig bringt. Man ist mit anderen Techniken sicherlich besser beraten bei der Konstruktion eines Exploits.



  • So ähnlich hab ich mir das auch gedacht, sehr gut 🙂

    Ich stellte die Frage, weil das einer der Aufgabenstellungen in einer meiner Klausuren sein wird.
    Dort wird ein C-Quellcode angeben, man soll dann verschiedene Sicherheitslücken auflisten und für einige davon einen konkreten Weg aufzeigen, wie diese für den gegebenen Quellcode ausgenutzt werden kann.

    Dieses "konkrete Beschreibung" klang halt sehr nach "sag mir was ich eingeben muss, damit es tatsächlich passiert".

    Beispielsweise ist ein Beispiel angegeben, in dem durch ein bufferoverflow eine Ergebnis Variable überschrieben wird und somit ein Login mit falschen Daten möglich ist.
    Ich hatte mich nur gefragt, woher ich in der Klausur wissen soll, wie viel Bytes genau die einzelnen Variablen im Speicher auseinander liegen - in dem Fall waren es halt gerade 24, d.h als Eingabe bräuchte man 25 Zeichen.
    Hab das daheim bei meinem Compiler auch so rekonstruieren können, aber so wie ich das verstanden habe gibt es keine Garantie dafür, weil der ISO C Standard überhaupt keine gibt und das somit Compiler abhängig ist.



  • Solche Sachen hängen vom Alignment ab. D.h. wo welche Daten im Speicher stehen. Auf dem Stack hat der Compiler zudem alle Freiheiten Variablen anzuordnen.

    Compiler haben da auch Mechanismen, die versuchen buffer overruns abzufangen/prüfen (siehe /GS bei VS).


Log in to reply