Large Bin Attack

Unterstützen Sie HackTricks

Grundlegende Informationen

Für weitere Informationen darüber, was ein großer Binär ist, siehe diese Seite:

Bins & Memory Allocations

Es ist möglich, ein großartiges Beispiel in how2heap - großer Binärangriff zu finden.

Im Grunde können Sie hier sehen, wie in der neuesten "aktuellen" Version von glibc (2.35) nicht überprüft wird: P->bk_nextsize, was es ermöglicht, eine beliebige Adresse mit dem Wert eines großen Binärchunks zu ändern, wenn bestimmte Bedingungen erfüllt sind.

In diesem Beispiel finden Sie die folgenden Bedingungen:

  • Ein großer Chunk wird allokiert

  • Ein großer Chunk, der kleiner als der erste ist, aber im selben Index liegt, wird allokiert

  • Muss kleiner sein, damit er zuerst in den Binär geht

  • (Ein Chunk, um das Zusammenführen mit dem obersten Chunk zu verhindern, wird erstellt)

  • Dann wird der erste große Chunk freigegeben und ein neuer Chunk, der größer ist als dieser, wird allokiert -> Chunk1 geht in den großen Binär

  • Dann wird der zweite große Chunk freigegeben

  • Jetzt die Schwachstelle: Der Angreifer kann chunk1->bk_nextsize auf [target-0x20] ändern

  • Dann wird ein größerer Chunk als Chunk 2 allokiert, sodass Chunk 2 in den großen Binär eingefügt wird und die Adresse chunk1->bk_nextsize->fd_nextsize mit der Adresse von Chunk 2 überschrieben wird

Es gibt andere potenzielle Szenarien, das Ziel ist es, dem großen Binär einen Chunk hinzuzufügen, der kleiner ist als ein aktueller X-Chunk im Binär, sodass er direkt davor im Binär eingefügt werden muss, und wir müssen in der Lage sein, X's bk_nextsize zu ändern, da dort die Adresse des kleineren Chunks geschrieben wird.

Dies ist der relevante Code von malloc. Kommentare wurden hinzugefügt, um besser zu verstehen, wie die Adresse überschrieben wurde:

/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk

victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}

Dies könnte verwendet werden, um die globale Variable global_max_fast von libc zu überschreiben, um dann einen Fast-Bin-Angriff mit größeren Chunks auszunutzen.

Eine weitere großartige Erklärung dieses Angriffs finden Sie bei guyinatuxedo.

Weitere Beispiele

  • Großer Bin-Angriff in derselben Situation, wie er in how2heap erscheint.

  • Die Schreibprimitive ist komplexer, da global_max_fast hier nutzlos ist.

  • FSOP wird benötigt, um den Exploit abzuschließen.

Unterstützen Sie HackTricks

Last updated