Large Bin Attack

Wesprzyj HackTricks

Podstawowe informacje

Aby uzyskać więcej informacji na temat tego, co to jest duży kubeł, sprawdź tę stronę:

Bins & Memory Allocations

Możliwe jest znalezienie świetnego przykładu w how2heap - ataku na duży kubeł.

W zasadzie tutaj można zobaczyć, jak w najnowszej "obecnej" wersji glibc (2.35) nie jest sprawdzane: P->bk_nextsize, co pozwala zmodyfikować dowolny adres wartością dużego kawałka kubełka, jeśli spełnione są pewne warunki.

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

  • Zaalokowany jest duży kawałek

  • Zaalokowany jest duży kawałek mniejszy niż pierwszy, ale w tym samym indeksie

  • Musi być mniejszy, więc musi iść pierwszy w kubełku

  • (Utworzony jest kawałek, aby zapobiec scaleniu z kawałkiem górnym)

  • Następnie pierwszy duży kawałek jest zwalniany, a zaalokowany jest nowy kawałek większy niż on -> Kawałek1 trafia do dużego kubełka

  • Następnie drugi duży kawałek jest zwalniany

  • Teraz podatność: Atakujący może zmodyfikować chunk1->bk_nextsize na [target-0x20]

  • Następnie zaalokowany jest większy kawałek niż kawałek 2, więc kawałek2 jest wstawiany do dużego kubełka, nadpisując adres chunk1->bk_nextsize->fd_nextsize adresem kawałka2

Istnieją inne potencjalne scenariusze, chodzi o dodanie do dużego kubełka kawałka, który jest mniejszy niż obecny kawałek X w kubełku, więc musi zostać wstawiony tuż przed nim w kubełku, i musimy móc zmodyfikować bk_nextsize X, ponieważ tam zostanie zapisany adres mniejszego kawałka.

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

/* 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żna wykorzystać do nadpisania zmiennej globalnej global_max_fast w bibliotece libc, aby następnie wykorzystać atak na szybkie kubełki z większymi fragmentami.

Możesz znaleźć inną świetną wyjaśnienie tego ataku na stronie guyinatuxedo.

Inne przykłady

  • Atak na duży kubełek w takiej samej sytuacji, jak to się pojawia w how2heap.

  • Prymityw zapisu jest bardziej skomplikowany, ponieważ global_max_fast jest tu bezużyteczny.

  • FSOP jest potrzebny do zakończenia eksploatacji.

Wesprzyj HackTricks

Last updated