malloc & sysmalloc
Last updated
Last updated
Lernen Sie AWS-Hacking: Lernen Sie GCP-Hacking:
(In dieser Zusammenfassung werden keine Überprüfungen erläutert und einige Fälle wurden der Kürze halber ausgelassen)
__libc_malloc
versucht, einen Chunk aus dem tcache zu erhalten. Wenn nicht, ruft es _int_malloc
auf.
_int_malloc
:
Versucht, die Arena zu generieren, wenn keine vorhanden ist.
Wenn ein passender Fast-Bin-Chunk vorhanden ist, wird dieser verwendet.
Füllen Sie den tcache mit anderen Fast-Chunks.
Wenn ein Small-Bin-Chunk der richtigen Größe vorhanden ist, wird dieser verwendet.
Füllen Sie den tcache mit anderen Chunks dieser Größe.
Wenn die angeforderte Größe nicht für Small-Bins ist, konsolidieren Sie den Fast-Bin in den unsortierten Bin.
Überprüfen Sie den unsortierten Bin und verwenden Sie den ersten Chunk mit ausreichend Platz.
Wenn der gefundene Chunk größer ist, teilen Sie ihn auf, um einen Teil zurückzugeben, und fügen Sie den Rest wieder dem unsortierten Bin hinzu.
Wenn ein Chunk die gleiche Größe wie die angeforderte Größe hat, verwenden Sie ihn, um den tcache anstelle der Rückgabe zu füllen (bis der tcache voll ist, dann geben Sie den nächsten zurück).
Für jeden überprüften Chunk kleinerer Größe legen Sie ihn in den entsprechenden Small- oder Large-Bin.
Überprüfen Sie den Large-Bin im Index der angeforderten Größe.
Beginnen Sie mit der Suche ab dem ersten Chunk, der größer als die angeforderte Größe ist. Wenn einer gefunden wird, geben Sie ihn zurück und fügen Sie die Reste dem Small-Bin hinzu.
Überprüfen Sie die Large-Bins von den nächsten Indizes bis zum Ende.
Überprüfen Sie ab dem nächsten größeren Index auf einen beliebigen Chunk, teilen Sie den ersten gefundenen Chunk auf, um ihn für die angeforderte Größe zu verwenden, und fügen Sie den Rest dem unsortierten Bin hinzu.
Wenn in den vorherigen Bins nichts gefunden wurde, erhalten Sie einen Chunk vom Top-Chunk.
Wenn der Top-Chunk nicht groß genug war, vergrößern Sie ihn mit sysmalloc
.
Die malloc
-Funktion ruft tatsächlich __libc_malloc
auf. Diese Funktion überprüft den tcache, um zu sehen, ob ein verfügbarer Chunk der gewünschten Größe vorhanden ist. Wenn ja, wird er verwendet, andernfalls wird überprüft, ob es sich um einen einzelnen Thread handelt, und in diesem Fall wird _int_malloc
in der Hauptarena aufgerufen, andernfalls wird _int_malloc
in der Arena des Threads aufgerufen.