Large Bin Attack

Reading time: 4 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Basic Information

Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα large bin, ελέγξτε αυτή τη σελίδα:

Bins & Memory Allocations

Είναι δυνατόν να βρείτε ένα εξαιρετικό παράδειγμα στο how2heap - large bin attack.

Βασικά, εδώ μπορείτε να δείτε πώς, στην τελευταία "τρέχουσα" έκδοση του glibc (2.35), δεν ελέγχεται: P->bk_nextsize επιτρέποντας την τροποποίηση μιας αυθαίρετης διεύθυνσης με την τιμή ενός large bin chunk αν πληρούνται ορισμένες προϋποθέσεις.

Σε αυτό το παράδειγμα μπορείτε να βρείτε τις εξής προϋποθέσεις:

  • Ένα μεγάλο chunk έχει κατανεμηθεί
  • Ένα μεγάλο chunk μικρότερο από το πρώτο αλλά στην ίδια θέση έχει κατανεμηθεί
  • Πρέπει να είναι μικρότερο ώστε να πάει πρώτο στο bin
  • (Ένα chunk για να αποτραπεί η συγχώνευση με το top chunk έχει δημιουργηθεί)
  • Στη συνέχεια, το πρώτο μεγάλο chunk απελευθερώνεται και ένα νέο chunk μεγαλύτερο από αυτό κατανεμηθεί -> Chunk1 πηγαίνει στο large bin
  • Στη συνέχεια, το δεύτερο μεγάλο chunk απελευθερώνεται
  • Τώρα, η ευπάθεια: Ο επιτιθέμενος μπορεί να τροποποιήσει chunk1->bk_nextsize σε [target-0x20]
  • Στη συνέχεια, ένα μεγαλύτερο chunk από το chunk 2 κατανεμηθεί, έτσι το chunk2 εισάγεται στο large bin αντικαθιστώντας τη διεύθυνση chunk1->bk_nextsize->fd_nextsize με τη διεύθυνση του chunk2

tip

Υπάρχουν άλλα πιθανά σενάρια, το θέμα είναι να προσθέσουμε στο large bin ένα chunk που είναι μικρότερο από ένα τρέχον X chunk στο bin, έτσι πρέπει να εισαχθεί ακριβώς πριν από αυτό στο bin, και πρέπει να μπορούμε να τροποποιήσουμε το bk_nextsize του X καθώς εκεί θα γραφτεί η διεύθυνση του μικρότερου chunk.

Αυτός είναι ο σχετικός κώδικας από το malloc. Έχουν προστεθεί σχόλια για να κατανοήσουμε καλύτερα πώς η διεύθυνση αντικαταστάθηκε:

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
}

Αυτό θα μπορούσε να χρησιμοποιηθεί για να επικαλύψει τη μεταβλητή global_max_fast της libc για να εκμεταλλευτεί μια επίθεση fast bin με μεγαλύτερα κομμάτια.

Μπορείτε να βρείτε μια άλλη εξαιρετική εξήγηση αυτής της επίθεσης στο guyinatuxedo.

Άλλα παραδείγματα

  • La casa de papel. HackOn CTF 2024
  • Επίθεση large bin στην ίδια κατάσταση όπως εμφανίζεται στο how2heap.
  • Η primitive εγγραφής είναι πιο περίπλοκη, επειδή το global_max_fast είναι άχρηστο εδώ.
  • Χρειάζεται FSOP για να ολοκληρωθεί η εκμετάλλευση.

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks