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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
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:
/* 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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.