57 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Large Bin Attack
{{#include ../../banners/hacktricks-training.md}}
## Basic Information
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα large bin, ελέγξτε αυτή τη σελίδα:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
Είναι δυνατόν να βρείτε ένα εξαιρετικό παράδειγμα στο [**how2heap - large bin attack**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c).
Βασικά, εδώ μπορείτε να δείτε πώς, στην τελευταία "τρέχουσα" έκδοση του 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**](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html).
### Άλλα παραδείγματα
- [**La casa de papel. HackOn CTF 2024**](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/)
- Επίθεση large bin στην ίδια κατάσταση όπως εμφανίζεται στο [**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c).
- Η primitive εγγραφής είναι πιο περίπλοκη, επειδή το `global_max_fast` είναι άχρηστο εδώ.
- Χρειάζεται FSOP για να ολοκληρωθεί η εκμετάλλευση.
{{#include ../../banners/hacktricks-training.md}}