Large Bin Attack

Reading time: 3 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Basic Information

Pour plus d'informations sur ce qu'est un grand bin, consultez cette page :

Bins & Memory Allocations

Il est possible de trouver un excellent exemple dans how2heap - large bin attack.

Fondamentalement, ici vous pouvez voir comment, dans la dernière version "courante" de glibc (2.35), il n'est pas vérifié : P->bk_nextsize permettant de modifier une adresse arbitraire avec la valeur d'un chunk de grand bin si certaines conditions sont remplies.

Dans cet exemple, vous pouvez trouver les conditions suivantes :

  • Un grand chunk est alloué
  • Un grand chunk plus petit que le premier mais au même index est alloué
  • Doit être plus petit donc dans le bin il doit aller en premier
  • (Un chunk pour empêcher la fusion avec le chunk supérieur est créé)
  • Ensuite, le premier grand chunk est libéré et un nouveau chunk plus grand est alloué -> Chunk1 va dans le grand bin
  • Ensuite, le deuxième grand chunk est libéré
  • Maintenant, la vulnérabilité : L'attaquant peut modifier chunk1->bk_nextsize à [target-0x20]
  • Ensuite, un chunk plus grand que chunk 2 est alloué, donc chunk2 est inséré dans le grand bin écrasant l'adresse chunk1->bk_nextsize->fd_nextsize avec l'adresse de chunk2

tip

Il existe d'autres scénarios potentiels, l'idée est d'ajouter au grand bin un chunk qui est plus petit qu'un chunk X actuel dans le bin, donc il doit être inséré juste avant dans le bin, et nous devons être capables de modifier bk_nextsize de X car c'est là que l'adresse du chunk plus petit sera écrite.

Voici le code pertinent de malloc. Des commentaires ont été ajoutés pour mieux comprendre comment l'adresse a été écrasée :

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
}

Cela pourrait être utilisé pour écraser la variable globale global_max_fast de libc afin d'exploiter une attaque de fast bin avec des chunks plus grands.

Vous pouvez trouver une autre excellente explication de cette attaque dans guyinatuxedo.

Autres exemples

  • La casa de papel. HackOn CTF 2024
  • Attaque de large bin dans la même situation que celle qui apparaît dans how2heap.
  • Le primitive d'écriture est plus complexe, car global_max_fast est inutile ici.
  • FSOP est nécessaire pour terminer l'exploit.

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks