Was
ist ein Bufferoverflow und wie funktioniert er ? |
Einleitung: |
hi, Heute gehts um ein spezielles Thema was man verstanden haben muss um selber auf Exploit jagdt zu gehen ... naja da muss man noch ein haufen mehr wissen , aber damit ihr /ich auch mal das Gefühl bekomme was so ein Bufferoverrun überhaupt is habe ich das TUT geschrieben habe auch viel zu dem Thema gelesen :) und das wesentliche zusammengefasst !!! |
Inhaltsverzeichnis |
Was
passiert bei einem Bufferoverrun ? Die Gefahren der Bufferoveruns Probleme beim Software erstellen Erweitertes Wissen Quellen: |
Was passiert bei einem Bufferoverrun ? |
Bei einem Programmstart
werden den ganzen Variablen die man braucht Werte zugewiesen um die
Variablen zu initiallisieren !! So um Programm selbst könnte man
auch nochmal eine überschreibung der Initialisierung vornehmen
z.B. ' |
Die Gefahren der Bufferoveruns |
Wir haben erfahren das eine zufällige Rücksprungadresse geschaffen wird und von der versucht wird weiterzuarbeiten. So ein Cracker / Hacker versucht nun diese Rücksprungadresse so zu modifizieren das die Rücksprungadresse keinen Zufallswert mehr besitzt , sondern eine vom Cracker / Hacker gewollte Adresse von der aus dann ein spezieller Code ausgeführt wird bezeichnet man in English als (arbitrary code) . So kann ein Cracker / Hacker nun einen alles mögliche anstellen Sicherheitseinstellungen modifizieren , Programm abstürtzte verursachen , Ausführen von Externen Programmen etc... Der Cracker / Hacker biegt "einfach" nur die Rücksprungadresse um auf irgendwas was im Speicher liegt was er gerne ausgeführt haben möchte :). Es gab schon die verrücktesten Bufferoverruns die es einem sogar erlaubten eine Firewall auszuschalten |
Probleme beim Software erstellen |
nehmen wir mal Java als gutes Beispiel es ist so ziemlich unverwundbar gegen Bufferoverflows jeder Art , da es seine Speicherverwaltung genau überwacht (Garbage Collektion) . C++ ist auch noch einigermassen sicher aber aber C hat die größten Probleme denkt man mal an denn Befehl strcpy () , da kann man die verrücktesten Sachen erleben wenn , strcpy(Ziel,Quelle) , Quelle wäre größer als Ziel schon hat man einen Bufferoverflow . Ich habe schon verrückte ausgaben nachher erlebt ASM Quellcode und sonstige Sachen aus dem Arbeitsspeicher ohne das das Programm eine "Speicherverletzung" verursacht hat ... Das war auch ein Bufferoverflow der meistens durch zu kleine Char Arrays passiert , die Funktion stringcopy kennt da keine gnade und überschreibt gleich ein paar Daten im Arbeitsspeicher... und da gibts einige solcher "gefährlichen" Funktionen ... C++ hat aber gute Debugger um solche Fehler zu vermeiden .... aber täglich gibts neue Meldungen über Bufferoverruns bei Bugtraq z.B. Cert etc..und das selbst bei denn M$ Produkten oder findet ihr es nicht peinlich das durch das simples betrachten von .chm (HTML Hilfedateien) alles Abstürtzt |
Erweitertes Wissen |
"Der Prozessor ist eine
Recheneinheit, ergänzt um Register. Die Register kann man sich als
interne Speicherstellen vorstellen, welche über symbolische Namen
(EAX, EIP, ...) angesprochen werden. Die meisten dienen als allgemeine
Zwischenspeicher für Rechenoperationen, Parameterübergabe und
so weiter. Doch einige dieser Register erfüllen spezielle Aufgaben.
Dazu gehören insbesondere der Instruction Pointer (EIP), der Base
Pointer (EBP) und der Stack Pointer (ESP). Das vorangestellte ‘E’
steht für Extended und unterscheidet die 32-Bit-Register von ihren
16 Bit großen Pendants. Der Instruction Pointer zeigt immer auf die Adresse des nächsten auszuführenden Maschinenbefehls. Nachdem der Prozessor eine Anweisung abgearbeitet hat, lädt er den nächsten Befehl von dieser Adresse und setzt den Zeiger weiter. Beim Verzweigen in eine Unterfunktion überschreibt das Programm den Instruction Pointer mit deren Startadresse. Base Pointer (EBP) und Stack Pointer (ESP) beschreiben den lokalen Speicherbereich einer Unterfunktion. Sowohl der Heap als auch der Stack können zur Laufzeit des Programms wachsen. Bei modernen Betriebssystemen arbeitet jedes Programm in einem eigenen, virtuellen Adressraum, dessen Adressen die Hardware - konkret die Memory Management Unit (MMU) - erst bei Bedarf ‘echten’ Speicher zuordnet. In diesem legt das Betriebssystem beim Start eines Programms drei so genannte Segmente an: das Code-Segment, das Daten-Segment (auch Heap genannt) und das Stack-Segment. ‘Unten’ im Adressraum - also an den niedrigen Adressen - befindet sich das Code-Segment mit den eigentlichen Maschinenbefehlen des Programms. Es ist in Größe und Inhalt fest und zumeist gegen Überschreiben geschützt. Das heißt, ein Schreibversuch auf diese Adresse produziert eine Speicherschutzverletzung (‘segmentation violation’)." |
Quellen: |
http://www.nextgenss.com/papers/ntbufferoverflow.html
<-- mit sehr netten Beispiel :) http://www.phrack.org/phrack/49/P49-14 <-- Für denn Programmierer beschrieben http://www.w00w00.org/files/articles/heaptut.txt <-- Heap Overflows |