First Fit
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wenn du Speicher in einem Programm mit glibc freigibst, werden verschiedene "Bins" verwendet, um die Speicherblöcke zu verwalten. Hier ist eine vereinfachte Erklärung von zwei häufigen Szenarien: unsortierte Bins und Fastbins.
Wenn du einen Speicherblock freigibst, der kein schneller Block ist, gelangt er in den unsortierten Bin. Dieser Bin fungiert wie eine Liste, in die neue freigegebene Blöcke an den Anfang (den "Kopf") hinzugefügt werden. Wenn du einen neuen Speicherblock anforderst, schaut der Zuweiser von hinten (dem "Schwanz") in den unsortierten Bin, um einen Block zu finden, der groß genug ist. Wenn ein Block aus dem unsortierten Bin größer ist als das, was du benötigst, wird er aufgeteilt, wobei der vordere Teil zurückgegeben wird und der verbleibende Teil im Bin bleibt.
Beispiel:
Du allocierst 300 Bytes (a
), dann 250 Bytes (b
), gibst a
frei und forderst erneut 250 Bytes (c
) an.
Wenn du a
freigibst, gelangt es in den unsortierten Bin.
Wenn du dann erneut 250 Bytes anforderst, findet der Zuweiser a
am Schwanz und teilt es auf, wobei der Teil zurückgegeben wird, der deiner Anfrage entspricht, und der Rest im Bin bleibt.
c
wird auf das vorherige a
zeigen und mit den a's
gefüllt sein.
Fastbins werden für kleine Speicherstücke verwendet. Im Gegensatz zu unsortierten Bins fügen Fastbins neue Stücke am Kopf hinzu, was ein Last-in-First-out (LIFO) Verhalten erzeugt. Wenn Sie ein kleines Speicherstück anfordern, zieht der Allocator vom Kopf des Fastbins.
Beispiel:
Sie allocieren vier Stücke von jeweils 20 Bytes (a
, b
, c
, d
).
Wenn Sie sie in beliebiger Reihenfolge freigeben, werden die freigegebenen Stücke am Kopf des Fastbins hinzugefügt.
Wenn Sie dann ein 20-Byte-Stück anfordern, gibt der Allocator das zuletzt freigegebene Stück vom Kopf des Fastbins zurück.
ARM64. Use after free: Erzeuge ein Benutzerobjekt, gib es frei, erzeuge ein Objekt, das den freigegebenen Chunk erhält und schreibe darauf, überschreibe die Position von user->password vom vorherigen. Wiederverwende den Benutzer, um die Passwortüberprüfung zu umgehen
Das Programm erlaubt das Erstellen von Notizen. Eine Notiz hat die Notizinformationen in einem malloc(8) (mit einem Zeiger auf eine Funktion, die aufgerufen werden könnte) und einen Zeiger auf ein anderes malloc(<size>) mit dem Inhalt der Notiz.
Der Angriff besteht darin, 2 Notizen (note0 und note1) mit größeren malloc-Inhalten als der Notizinformationsgröße zu erstellen und sie dann freizugeben, damit sie in den Fast Bin (oder tcache) gelangen.
Erstelle dann eine weitere Notiz (note2) mit einer Inhaltsgröße von 8. Der Inhalt wird in note1 sein, da der Chunk wiederverwendet wird, wo wir den Funktionszeiger ändern könnten, um auf die Gewinnfunktion zu zeigen und dann Use-After-Free die note1, um den neuen Funktionszeiger aufzurufen.
Es ist möglich, etwas Speicher zu alloc, den gewünschten Wert zu schreiben, ihn freizugeben, ihn erneut zu alloc und da die vorherigen Daten noch vorhanden sind, wird er gemäß der neuen erwarteten Struktur im Chunk behandelt, was es ermöglicht, den Wert zu setzen, um das Flag zu erhalten.
In diesem Fall ist es notwendig, 4 in einen bestimmten Chunk zu schreiben, der der erste ist, der allociert wird (auch nachdem alle zwangsweise freigegeben wurden). Bei jedem neu allocierten Chunk wird seine Nummer im Array-Index gespeichert. Dann, allociere 4 Chunks (+ den ursprünglich allocierten), der letzte wird 4 enthalten, gib sie frei und erzwinge die Reallokation des ersten, der den letzten freigegebenen Chunk verwenden wird, der den 4 enthält.