House of Roman
Grundlegende Informationen
Dies war eine sehr interessante Technik, die RCE ohne Leaks über gefälschte Fastbins, den unsorted_bin-Angriff und relative Überschreibungen ermöglichte. Es wurde jedoch gepatcht.
Code
Ein Beispiel finden Sie unter https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
Ziel
RCE durch Ausnutzung relativer Zeiger
Anforderungen
Bearbeiten von Fastbin- und Unsorted-Bin-Zeigern
12 Bits Zufälligkeit müssen erraten werden (0,02% Erfolgschance)
Angriffsschritte
Teil 1: Fastbin-Chunk zeigt auf __malloc_hook
Erstellen mehrerer Chunks:
fastbin_victim
(0x60, Offset 0): UAF-Chunk, der später bearbeitet wird, um den Heap-Zeiger auf den LibC-Wert zu zeigen.chunk2
(0x80, Offset 0x70): Für gute Ausrichtungmain_arena_use
(0x80, Offset 0x100)relative_offset_heap
(0x60, Offset 0x190): Relativer Offset auf dem 'main_arena_use'-Chunk
Dann free(main_arena_use)
, was diesen Chunk in die unsortierte Liste platziert und einen Zeiger auf main_arena + 0x68
in sowohl den fd
als auch bk
Zeigern erhält.
Nun wird ein neuer Chunk fake_libc_chunk(0x60)
allokiert, da er die Zeiger auf main_arena + 0x68
in fd
und bk
enthalten wird.
Dann werden relative_offset_heap
und fastbin_victim
freigegeben.
fastbin_victim
hat einfd
, das aufrelative_offset_heap
zeigtrelative_offset_heap
ist ein Offset von der Entfernung zufake_libc_chunk
, der einen Zeiger aufmain_arena + 0x68
enthältDurch Ändern des letzten Bytes von
fastbin_victim.fd
ist es möglich, dassfastbin_victim
aufmain_arena + 0x68
zeigt
Für die vorherigen Aktionen muss der Angreifer in der Lage sein, den fd-Zeiger von fastbin_victim
zu ändern.
Dann ist main_arena + 0x68
nicht so interessant, also ändern wir es so, dass der Zeiger auf __malloc_hook
zeigt.
Beachten Sie, dass __memalign_hook
normalerweise mit 0x7f
beginnt und Nullen davor hat, dann ist es möglich, es als Wert im 0x70
Fastbin zu fälschen. Da die letzten 4 Bits der Adresse zufällig sind, gibt es 2^4=16
Möglichkeiten für den Wert, um dorthin zu zeigen, wo wir interessiert sind. Daher wird hier ein BF-Angriff durchgeführt, damit der Chunk wie folgt endet: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
.
(Weitere Informationen zu den restlichen Bytes finden Sie in der Erklärung im how2heap Beispiel). Wenn der BF nicht funktioniert, stürzt das Programm einfach ab (also starten Sie erneut, bis es funktioniert).
Dann werden 2 mallocs durchgeführt, um die 2 anfänglichen Fastbin-Chunks zu entfernen, und dann wird ein dritter allokiert, um einen Chunk im __malloc_hook:
zu erhalten.
Teil 2: Unsorted_bin Angriff
Für weitere Informationen kannst du überprüfen:
Unsorted Bin AttackAber im Grunde erlaubt es, main_arena + 0x68
an jede Stelle zu schreiben, die in chunk->bk
angegeben ist. Und für den Angriff wählen wir __malloc_hook
. Dann, nachdem wir es überschrieben haben, werden wir eine relative Überschreibung verwenden, um auf ein one_gadget
zu zeigen.
Dafür beginnen wir damit, einen Chunk zu erhalten und ihn in den unsorted bin zu platzieren:
Verwenden Sie einen UAF in diesem Abschnitt, um unsorted_bin_ptr->bk
auf die Adresse von __malloc_hook
zu zeigen (wir haben dies zuvor durch Brute-Force ermittelt).
Beachten Sie, dass dieser Angriff den unsortierten Bin beschädigt (und somit auch den kleinen und großen Bin). Daher können wir jetzt nur Zuweisungen aus dem Fast Bin verwenden (ein komplexeres Programm könnte andere Zuweisungen durchführen und abstürzen), und um dies auszulösen, müssen wir die gleiche Größe zuweisen, oder das Programm wird abstürzen.
Um also das Schreiben von main_arena + 0x68
in __malloc_hook
auszulösen, führen wir nach dem Setzen von __malloc_hook
in unsorted_bin_ptr->bk
einfach aus: malloc(0x80)
Schritt 3: Setzen von __malloc_hook auf system
Im ersten Schritt kontrollierten wir einen Chunk, der __malloc_hook
enthält (in der Variablen malloc_hook_chunk
) und im zweiten Schritt gelang es uns, main_arena + 0x68
hierhin zu schreiben.
Nun nutzen wir eine teilweise Überschreibung in malloc_hook_chunk
, um die libc-Adresse, die wir dort geschrieben haben (main_arena + 0x68
), zu verwenden, um eine one_gadget
-Adresse zu zeigen.
Hier ist es erforderlich, 12 Bits Zufälligkeit zu bruteforcen (weitere Informationen im how2heap Beispiel).
Schließlich, sobald die richtige Adresse überschrieben ist, rufen Sie malloc
auf und lösen Sie den one_gadget
aus.
Referenzen
Last updated