Off by one overflow
Last updated
Last updated
Lernen Sie AWS-Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wenn ein Angreifer nur auf einen 1B-Überlauf zugreifen kann, kann er das size
-Feld des nächsten Chunks ändern. Dies ermöglicht es, welche Chunks tatsächlich freigegeben werden, zu manipulieren und potenziell einen Chunk zu erzeugen, der einen anderen legitimen Chunk enthält. Die Ausnutzung ähnelt einem Doppel-Free oder überlappenden Chunks.
Es gibt 2 Arten von Off-by-One-Schwachstellen:
Beliebiges Byte: Diese Art ermöglicht das Überschreiben dieses Bytes mit einem beliebigen Wert.
Nullbyte (Off-by-Null): Diese Art ermöglicht es, dieses Byte nur mit 0x00 zu überschreiben.
Ein häufiges Beispiel für diese Schwachstelle ist im folgenden Code zu sehen, in dem das Verhalten von strlen
und strcpy
inkonsistent ist, was es ermöglicht, ein 0x00-Byte am Anfang des nächsten Chunks zu setzen.
Dies kann mit dem House of Einherjar ausgenutzt werden.
Wenn Tcache verwendet wird, kann dies zu einer Doppel-Freigabe führen.
Unter anderem wird jetzt bei jedem Freigeben eines Chunks die vorherige Größe mit der im Metadaten-Chunk konfigurierten Größe verglichen, was diesen Angriff ab Version 2.28 ziemlich komplex macht.
Dieser Angriff funktioniert nicht mehr aufgrund der Verwendung von Tcaches.
Darüber hinaus, wenn Sie versuchen, es mit größeren Chunks zu missbrauchen (damit Tcaches nicht involviert sind), erhalten Sie den Fehler: malloc(): invalid next size (unsorted)
Einen Chunk in einem anderen Chunk enthalten, sodass Schreibzugriff auf diesen zweiten Chunk es ermöglicht, den enthaltenen zu überschreiben
Off-by-one-Überlauf, um die Größenmetadateninformationen zu ändern
Reservieren Sie drei Chunks A
, B
und C
(sagen wir Größen 0x20), und einen weiteren, um die Konsolidierung mit dem Top-Chunk zu verhindern.
Geben Sie C
frei (eingefügt in die 0x20 Tcache-Freiliste).
Verwenden Sie Chunk A
, um auf B
zu überlaufen. Missbrauchen Sie das Off-by-One, um das size
-Feld von B
von 0x21 auf 0x41 zu ändern.
Jetzt haben wir B
, das den freien Chunk C
enthält
Geben Sie B
frei und allozieren Sie einen 0x40 Chunk (es wird hier wieder platziert)
Wir können den fd
-Zeiger von C
ändern, der immer noch frei ist (Tcache-Vergiftung)
3 Speicherblöcke (a, b, c) werden nacheinander reserviert. Dann wird der mittlere freigegeben. Der erste enthält eine Off-by-One-Überlaufschwachstelle und der Angreifer missbraucht sie mit einer 0x00 (wenn das vorherige Byte 0x10 war, würde der mittlere Chunk anzeigen, dass er 0x10 kleiner ist als er wirklich ist).
Dann werden 2 kleinere Chunks im mittleren freigegebenen Chunk (b) alloziert, jedoch wird b + b->size
nie den c-Chunk aktualisieren, weil die adressierte Adresse kleiner ist als sie sein sollte.
Dann werden b1 und c freigegeben. Da c - c->prev_size
immer noch auf b zeigt (jetzt b1), werden beide in einem Chunk konsolidiert. Allerdings ist b2 immer noch zwischen b1 und c.
Schließlich wird ein neuer malloc durchgeführt, der diesen Speicherbereich zurückfordert, der tatsächlich b2 enthalten wird, was es dem Besitzer des neuen malloc ermöglicht, den Inhalt von b2 zu kontrollieren.
Dieses Bild erklärt den Angriff perfekt:
Off-by-one aufgrund von strlen
, das das size
-Feld des nächsten Chunks berücksichtigt.
Tcache wird verwendet, daher funktionieren allgemeine Off-by-One-Angriffe, um eine beliebige Schreibprimitive mit Tcache-Vergiftung zu erhalten.
Es ist möglich, ein Off-by-One zu missbrauchen, um eine Adresse aus dem Heap zu leaken, weil das Byte 0x00 am Ende einer Zeichenkette vom nächsten Feld überschrieben wird.
Eine beliebige Schreibweise wird durch den Missbrauch des Off-by-One-Schreibens erlangt, um den Zeiger auf einen anderen Ort zu setzen, an dem eine gefälschte Struktur mit gefälschten Zeigern erstellt wird. Dann ist es möglich, dem Zeiger dieser Struktur zu folgen, um eine beliebige Schreibweise zu erhalten.
Die libc-Adresse wird geleakt, weil wenn der Heap mit mmap erweitert wird, der von mmap allozierte Speicher einen festen Offset von libc hat.
Schließlich wird die beliebige Schreibweise missbraucht, um in die Adresse von __free_hook mit einem One-Gadget zu schreiben.
Es gibt eine NULL Off-by-One-Schwachstelle in der getline
-Funktion, die Benutzereingabezeilen liest. Diese Funktion wird verwendet, um den "Schlüssel" des Inhalts zu lesen und nicht den Inhalt.
Teilen Sie Hacking-Tricks, indem Sie Pull Requests an die HackTricks und HackTricks Cloud GitHub-Repositorys senden.