Tcache Bin Attack

Unterstützen Sie HackTricks

Grundlegende Informationen

Für weitere Informationen darüber, was ein Tcache-Bin ist, überprüfen Sie diese Seite:

Bins & Memory Allocations

Zunächst einmal ist zu beachten, dass der Tcache in der Glibc-Version 2.26 eingeführt wurde.

Der Tcache-Angriff (auch bekannt als Tcache-Vergiftung), vorgeschlagen auf der guyinatuxido-Seite, ist dem Fast-Bin-Angriff sehr ähnlich, bei dem das Ziel darin besteht, den Zeiger auf den nächsten Chunk im Bin innerhalb eines freigegebenen Chunks auf eine beliebige Adresse zu überschreiben, um später diese spezifische Adresse zu allokieren und potenziell Zeiger zu überschreiben.

Heutzutage erhalten Sie jedoch einen Fehler, wenn Sie den genannten Code ausführen: malloc(): unaligned tcache chunk detected. Daher ist es erforderlich, eine ausgerichtete Adresse als Adresse im neuen Zeiger zu schreiben (oder das Binärprogramm oft genug auszuführen, damit die geschriebene Adresse tatsächlich ausgerichtet ist).

Tcache-Index-Angriff

Normalerweise ist es möglich, am Anfang des Heaps einen Chunk zu finden, der die Anzahl der Chunks pro Index im Tcache und die Adresse zum Head-Chunk jedes Tcache-Index enthält. Wenn es aus irgendeinem Grund möglich ist, diese Informationen zu ändern, wäre es möglich, den Head-Chunk eines bestimmten Index auf eine gewünschte Adresse zeigen zu lassen (wie z. B. __malloc_hook), um dann einen Chunk der Größe des Index zu allokieren und den Inhalt von __malloc_hook in diesem Fall zu überschreiben.

Beispiele

  • Libc-Info-Leak: Es ist möglich, die Tcaches zu füllen, einen Chunk in die unsortierte Liste hinzuzufügen, die Tcache zu leeren und den Chunk aus dem unsortierten Bin erneut zuzuweisen, wobei nur die ersten 8B überschrieben werden, wobei die zweite Adresse zu libc aus dem Chunk intakt bleibt, sodass wir sie lesen können.

  • Tcache-Angriff: Das Binärprogramm ist anfällig für einen 1B-Heap-Überlauf. Dies wird ausgenutzt, um den Größenheader eines allokierten Chunks zu ändern und ihn größer zu machen. Dann wird dieser Chunk freigegeben, indem er zur Tcache der Chunks der gefälschten Größe hinzugefügt wird. Anschließend wird ein Chunk mit der gefälschten Größe allokiert, und der vorherige Chunk wird zurückgegeben, wobei bekannt ist, dass dieser Chunk tatsächlich kleiner war, und dies bietet die Möglichkeit, den nächsten Chunk im Speicher zu überschreiben. Dies wird ausgenutzt, um den FD-Zeiger des nächsten Chunks zu überschreiben, um auf malloc_hook zu zeigen, sodass es möglich ist, 2 Zeiger zu allokieren: zuerst den legitimen Zeiger, den wir gerade geändert haben, und dann wird die zweite Allokation einen Chunk in malloc_hook zurückgeben, den wir ausnutzen können, um ein One-Gadget zu schreiben.

  • Libc-Info-Leak: Es gibt ein Use-After-Free und ein Double-Free. In diesem Writeup hat der Autor eine libc-Adresse durch das Lesen der Adresse eines Chunks in einem kleinen Bin geleakt (ähnlich wie beim Leaken aus dem unsortierten Bin, aber aus dem kleinen Bin).

  • Tcache-Angriff: Ein Tcache wird über einen Double-Free durchgeführt. Derselbe Chunk wird zweimal freigegeben, sodass der Chunk im Tcache auf sich selbst zeigt. Anschließend wird er allokiert, sein FD-Zeiger wird geändert, um auf den Free-Hook zu zeigen, und dann wird er erneut allokiert, sodass der nächste Chunk in der Liste im Free-Hook sein wird. Dann wird auch dieser allokiert, und es ist möglich, hier die Adresse von system zu schreiben, sodass beim Freigeben eines mallocs, das "/bin/sh" enthält, eine Shell erhalten wird.

  • Die Hauptlücke hier besteht darin, dass jede Adresse im Heap durch Angabe ihres Offsets freigegeben werden kann.

  • Tcache-Index-Angriff: Es ist möglich, einen Chunk einer Größe zu allozieren und freizugeben, sodass beim Speichern im Tcache-Chunk (dem Chunk mit den Informationen der Tcache-Bins) eine Adresse mit dem Wert 0x100 generiert wird. Dies liegt daran, dass der Tcache die Anzahl der Chunks in jedem Bin in verschiedenen Bytes speichert, sodass ein Chunk in einem bestimmten Index den Wert 0x100 generiert.

  • Dann sieht dieser Wert so aus, als ob es einen Chunk der Größe 0x100 gäbe. Dies ermöglicht es, diese Adresse durch free zu missbrauchen. Dies wird diese Adresse zum Index der Chunks der Größe 0x100 im Tcache hinzufügen.

  • Dann wird ein Chunk der Größe 0x100 allokiert, und die vorherige Adresse wird als Chunk zurückgegeben, was es ermöglicht, andere Tcache-Indizes zu überschreiben. Indem man beispielsweise die Adresse des malloc-Hooks in einen von ihnen setzt und einen Chunk der Größe dieses Index allokiert, wird ein Chunk im calloc-Hook gewährt, was das Schreiben eines One-Gadgets ermöglicht, um eine Shell zu erhalten.

  • Die gleiche Schwachstelle wie zuvor mit einer zusätzlichen Einschränkung

  • Tcache-Index-Angriff: Ähnlicher Angriff wie der vorherige, aber mit weniger Schritten, indem der Chunk freigegeben wird, der die Tcache-Informationen enthält, sodass seine Adresse zum Tcache-Index seiner Größe hinzugefügt wird, sodass es möglich ist, diese Größe zu allozieren und die Tcache-Chunk-Informationen als Chunk zu erhalten, was es ermöglicht, den Free-Hook als Adresse eines Index hinzuzufügen, ihn zu allozieren und ein One-Gadget darauf zu schreiben.

  • Write After Free, um eine Zahl zum fd-Zeiger hinzuzufügen.

  • In dieser Herausforderung ist viel Heap-Feng-Shui erforderlich. Der Writeup zeigt, wie nützlich es ist, den Kopf der Tcache-Freiliste zu kontrollieren.

  • Glibc-Leak über stdout (FSOP).

  • Tcache-Vergiftung, um ein beliebiges Schreib-Primitive zu erhalten.

Unterstützen Sie HackTricks

Last updated