Fast Bin Attack
Grundlegende Informationen
Für weitere Informationen darüber, was ein schneller Bin ist, überprüfen Sie diese Seite:
Bins & Memory AllocationsDa der schnelle Bin eine einfach verkettete Liste ist, gibt es viel weniger Schutzmaßnahmen als in anderen Bins und es reicht aus, eine Adresse in einem freigegebenen schnellen Bin-Chunk zu ändern, um später einen Chunk in einer beliebigen Speicheradresse zu allozieren.
Zusammenfassend:
Sie können ein vollständiges Beispiel in einem sehr gut erklärten Code unter https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html finden:
Wenn es möglich ist, den Wert der globalen Variablen global_max_fast
mit einer großen Zahl zu überschreiben, ermöglicht dies das Generieren von Fast Bin Chunks mit größeren Größen, was potenziell ermöglicht, Fast Bin Attacks in Szenarien durchzuführen, in denen dies zuvor nicht möglich war. Diese Situation ist nützlich im Kontext des large bin attack und unsorted bin attack.
Beispiele
Es ist möglich, Chunks zuzuweisen, sie freizugeben, ihren Inhalt zu lesen und sie zu füllen (mit einer Überlaufschwachstelle).
Konsolidierung von Chunks für Infoleak: Die Technik besteht im Wesentlichen darin, den Überlauf zu missbrauchen, um eine gefälschte
prev_size
zu erstellen, sodass ein vorheriger Chunk in einen größeren Chunk gelegt wird. Wenn dann der größere Chunk allokiert wird, der einen anderen Chunk enthält, ist es möglich, dessen Daten zu drucken und eine Adresse an libc zu leaken (main_arena+88
).Überschreiben des malloc-Hooks: Durch Ausnutzen der vorherigen Überlappungssituation war es möglich, 2 Chunks zu haben, die auf denselben Speicher zeigten. Daher war es möglich, beide freizugeben (wobei ein anderer Chunk dazwischen freigegeben wurde, um Schutzmechanismen zu umgehen). Es war dann möglich, denselben Chunk zweimal im Fast Bin zu haben. Anschließend war es möglich, ihn erneut zuzuweisen, die Adresse zum nächsten Chunk zu überschreiben, um ein wenig vor
__malloc_hook
zu zeigen (damit es auf eine Ganzzahl zeigt, die malloc für eine freie Größe hält - ein weiterer Umgehungsweg), ihn erneut zuzuweisen und dann einen anderen Chunk zuzuweisen, der eine Adresse zu malloc-Hooks erhalten wird. Schließlich wurde ein one gadget dort geschrieben.Es gibt einen Heap-Überlauf und eine Verwendung nach Freigabe sowie eine doppelte Freigabe, da beim Freigeben eines Chunks die Zeiger wiederverwendet und erneut freigegeben werden können.
Libc-Infoleak: Einfach einige Chunks freigeben, und sie erhalten einen Zeiger auf einen Teil des Speicherbereichs der Hauptarena. Da freigegebene Zeiger wiederverwendet werden können, kann diese Adresse einfach gelesen werden.
Fast Bin Attack: Alle Zeiger auf die Allokationen werden in einem Array gespeichert, sodass wir ein paar Fast Bin Chunks freigeben und im letzten den Zeiger überschreiben können, um ein wenig vor dieses Array von Zeigern zu zeigen. Anschließend können ein paar Chunks mit derselben Größe allokiert werden, wobei wir zuerst den legitimen und dann den gefälschten erhalten, der das Array von Zeigern enthält. Wir können nun diese Allokationszeiger überschreiben, um die GOT-Adresse von
free
aufsystem
zu setzen und dann"/bin/sh"
in Chunk 1 zu schreiben, um dannfree(chunk1)
aufzurufen, was stattdessensystem("/bin/sh")
ausführt.Ein weiteres Beispiel für den Missbrauch eines ein Byte Überlaufs, um Chunks im unsortierten Bin zu konsolidieren und ein libc-Infoleak zu erhalten und dann einen Fast Bin Attack durchzuführen, um den malloc-Hook mit einer One-Gadget-Adresse zu überschreiben.
Nach einem Infoleak durch den Missbrauch des unsortierten Bins mit einem UAF, um eine libc-Adresse und eine PIE-Adresse zu leaken, verwendete das Exploit dieses CTF einen Fast Bin Attack, um einen Chunk an einem Ort zu allozieren, an dem die Zeiger auf kontrollierte Chunks lagen, sodass es möglich war, bestimmte Zeiger zu überschreiben, um ein One-Gadget in der GOT zu schreiben.
Sie können einen Fast Bin Attack missbraucht durch einen unsortierten Bin Attack finden:
Beachten Sie, dass es üblich ist, bevor Fast Bin Attacks durchgeführt werden, die Freelisten zu missbrauchen, um libc/Heap-Adressen zu leaken (wenn nötig).
Wir können nur Chunks der Größe größer als
0x100
allozieren.Überschreiben Sie
global_max_fast
mit einem Unsorted Bin Attack (funktioniert 1/16 Mal aufgrund von ASLR, da wir 12 Bits ändern müssen, aber 16 Bits ändern müssen).Fast Bin Attack, um ein globales Array von Chunks zu ändern. Dies ermöglicht ein beliebiges Lese-/Schreib-Primitive, mit dem die GOT geändert und eine Funktion so eingestellt werden kann, dass sie auf
system
zeigt.
Last updated