hacktricks/binary-exploitation/libc-heap/large-bin-attack.md

5.4 KiB

Groot Bin Aanval

{% hint style="success" %} Leer & oefen AWS Hack:HackTricks Opleiding AWS Red Team Expert (ARTE)
Leer & oefen GCP Hack: HackTricks Opleiding GCP Red Team Expert (GRTE)

Ondersteun HackTricks
{% endhint %}

Basiese Inligting

Vir meer inligting oor wat 'n groot bin is, kyk na hierdie bladsy:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

Dit is moontlik om 'n goeie voorbeeld te vind in how2heap - groot bin aanval.

Basies kan jy hier sien hoe, in die nuutste "huidige" weergawe van glibc (2.35), dit nie nagegaan word nie: P->bk_nextsize wat dit moontlik maak om 'n arbitrêre adres met die waarde van 'n groot bin brokkie te wysig as sekere voorwaardes voldoen word.

In daardie voorbeeld kan jy die volgende voorwaardes vind:

  • 'n Groot brokkie word toegewys
  • 'n Groot brokkie wat kleiner is as die eerste een maar in dieselfde indeks is, word toegewys
  • Dit moet kleiner wees sodat dit eerste in die bin moet gaan
  • ( 'n brokkie om te voorkom dat dit saamsmelt met die boonste brokkie word geskep)
  • Dan word die eerste groot brokkie vrygestel en 'n nuwe brokkie wat groter as dit is, word toegewys -> Brokkie1 gaan na die groot bin
  • Dan word die tweede groot brokkie vrygestel
  • Nou, die kwesbaarheid: Die aanvaller kan chunk1->bk_nextsize wysig na [target-0x20]
  • Dan word 'n groter brokkie as brokkie 2 toegewys, sodat brokkie2 in die groot bin ingevoeg word en die adres chunk1->bk_nextsize->fd_nextsize met die adres van brokkie2 oorskryf

{% hint style="success" %} Daar is ander potensiële scenario's, die ding is om 'n brokkie by die groot bin te voeg wat kleiner is as 'n huidige X brokkie in die bin, sodat dit net voor dit in die bin ingevoeg moet word, en ons moet in staat wees om X se bk_nextsize te wysig omdat dit waar die adres van die kleinere brokkie geskryf sal word. {% endhint %}

Hierdie is die relevante kode van malloc. Kommentaar is bygevoeg om beter te verstaan hoe die adres oorskryf is:

{% code overflow="wrap" %}

/* 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
}

{% endcode %}

Dit kan gebruik word om die global_max_fast globale veranderlike van libc te oor-skryf om dan 'n vinnige bin-aanval met groter brokke te benut.

Jy kan 'n ander goeie verduideliking van hierdie aanval vind by guyinatuxedo.

Ander voorbeelde

  • La casa de papel. HackOn CTF 2024
  • Groot bin-aanval in dieselfde situasie soos dit verskyn in how2heap.
  • Die skryf-primitief is meer kompleks, omdat global_max_fast hier nutteloos is.
  • FSOP is nodig om die aanval af te handel.

{% hint style="success" %} Leer & oefen AWS-hacking:HackTricks Opleiding AWS Red Team Expert (ARTE)
Leer & oefen GCP-hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)

Ondersteun HackTricks
{% endhint %}