2009-03-20 6 views
19

Wie Heap-Überlaufangriffe durchgeführt werden?Heap-Überlaufangriffe

Bei Stackoverflow-Angriffen ersetzt der Angreifer die Rückgabeadresse der Funktion durch seine Adresse.

Wie erfolgt dies bei Heap-Überlauf-Angriffen? Ist es auch möglich, Code von Heap auszuführen?

Antwort

32

Beachten Sie, dass dies von Plattform zu Plattform variiert und mein Beispiel zu stark vereinfacht ist. Es geht im Wesentlichen um Heap-Manager mit verknüpften Listen, die überschritten werden könnten, und Sie können die verknüpften Listenzeiger verwenden, um zufällige Teile des Prozessspeichers zu überschreiben.

Man stellt ich eine naive heap Implementierung deren Steuerblöcke wie folgt sind:

struct HeapBlockHeader 
{ 
    HeapBlockHeader* next; 
    HeapBlockHeader* prev; 
    int size; 

    // Actual heap buffer follows this structure. 
}; 

Wenn der Heap befreit wird, dieser Steuerblock in eine Liste von befreiten Blöcken zurückgeht, durch die nächsten/vorhergehenden Zeiger Modifizieren . Wenn ich einen Heap-Puffer überschreibe, kann ich die Zeiger im nächsten Steuerblock mit Daten überschreiben, die ich kontrolliere. Angenommen, ich überschreibe diese Links, um auf einen Code-Pointer zu zeigen (wahrscheinlich nur in den Puffer, den ich überrannt habe) und auf die Rückgabeadresse der Funktion auf dem Stack. Wenn der Heap-Manager versucht, den Block wieder in eine freigegebene Liste zu verknüpfen, überschreibt er tatsächlich die Rücksprungadresse auf dem Stapel mit einem Zeiger auf Code, den ich kontrolliere.

Dieser Artikel hat einen schönen Überblick über Überlaufangriffe Haufen: http://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

Dieser Artikel beschreibt einige der Härte beschreibt, die in Vista Heap-Manager ging diese Art von Angriff zu verhindern: http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

EDIT: Auf Möglichkeit, Code von Heap auszuführen, ja, es ist möglich. Viele Plattformen machen den Heap-Speicher jetzt standardmäßig nicht ausführbar, was die Barriere für die Ausführung von beliebigem Code erhöht. Allerdings können Sie immer noch eine "Sprung zu libc" -Art-Angriff - Überschreiben Sie die Absenderadresse zu einer bekannten Funktion, die ausführbar sein wird.

+0

Große Antwort - Ich fühle, dass ich eine Menge über meine speziellen Bereiche der Programmierung weiß, aber ich war nie in der Lage Compiler, Speicherverwaltung, Schutzmechanismen zu erforschen - zu wissen, wo die Verantwortlichkeiten des Prozessors aufhören und das Betriebssystem startet. Dann nochmal zwischen Betriebssystem und App-Code. Ich habe die Intel x86 Handbuch (Vol 1) Cover zu Cover gelesen. Wie bist du dazu gekommen, diese Dinge zu lernen? –