Large Bin Attack

Reading time: 3 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Basic Information

Aby uzyskać więcej informacji na temat tego, czym jest duży bin, sprawdź tę stronę:

{{#ref}} bins-and-memory-allocations.md {{#endref}}

Można znaleźć świetny przykład w how2heap - large bin attack.

W zasadzie tutaj można zobaczyć, jak w najnowszej "aktualnej" wersji glibc (2.35) nie jest sprawdzane: P->bk_nextsize, co pozwala na modyfikację dowolnego adresu wartością dużego kawałka, jeśli spełnione są określone warunki.

W tym przykładzie można znaleźć następujące warunki:

  • Duży kawałek jest alokowany
  • Duży kawałek mniejszy niż pierwszy, ale w tym samym indeksie, jest alokowany
  • Musi być mniejszy, więc w binie musi iść pierwszy
  • (Tworzony jest kawałek, aby zapobiec łączeniu z górnym kawałkiem)
  • Następnie pierwszy duży kawałek jest zwalniany, a nowy kawałek większy od niego jest alokowany -> Chunk1 trafia do dużego binu
  • Następnie drugi duży kawałek jest zwalniany
  • Teraz, luka: Atakujący może zmodyfikować chunk1->bk_nextsize na [target-0x20]
  • Następnie alokowany jest większy kawałek niż kawałek 2, więc kawałek 2 jest wstawiany do dużego binu, nadpisując adres chunk1->bk_nextsize->fd_nextsize adresem kawałka 2

tip

Istnieją inne potencjalne scenariusze, chodzi o dodanie do dużego binu kawałka, który jest mniejszy niż aktualny kawałek X w binie, więc musi być wstawiony tuż przed nim w binie, a my musimy być w stanie zmodyfikować bk_nextsize X, ponieważ tam zostanie zapisany adres mniejszego kawałka.

To jest odpowiedni kod z malloc. Dodano komentarze, aby lepiej zrozumieć, jak adres został nadpisany:

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

To może być użyte do nadpisania globalnej zmiennej global_max_fast w libc, aby następnie wykorzystać atak na szybkie biny z większymi kawałkami.

Możesz znaleźć inne świetne wyjaśnienie tego ataku w guyinatuxedo.

Inne przykłady

  • La casa de papel. HackOn CTF 2024
  • Atak na duże biny w tej samej sytuacji, w jakiej pojawia się w how2heap.
  • Primitwa zapisu jest bardziej złożona, ponieważ global_max_fast jest tutaj bezużyteczna.
  • FSOP jest potrzebny do zakończenia eksploitu.

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks