# House of Einherjar {{#include ../../banners/hacktricks-training.md}} ## Basic Information ### Code - Δείτε το παράδειγμα από [https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c) - Ή το ένα από [https://guyinatuxedo.github.io/42-house_of_einherjar/house_einherjar_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house_of_einherjar/house_einherjar_exp/index.html#house-of-einherjar-explanation) (μπορεί να χρειαστεί να συμπληρώσετε το tcache) ### Goal - Ο στόχος είναι να δεσμεύσετε μνήμη σε σχεδόν οποιαδήποτε συγκεκριμένη διεύθυνση. ### Requirements - Δημιουργήστε ένα ψεύτικο chunk όταν θέλουμε να δεσμεύσουμε ένα chunk: - Ρυθμίστε δείκτες να δείχνουν στον εαυτό τους για να παρακάμψουν τους ελέγχους εγκυρότητας - Μία-byte overflow με ένα null byte από ένα chunk στο επόμενο για να τροποποιήσετε τη σημαία `PREV_INUSE`. - Υποδείξτε στο `prev_size` του chunk που έχει κακοποιηθεί με off-by-null τη διαφορά μεταξύ του εαυτού του και του ψεύτικου chunk - Το μέγεθος του ψεύτικου chunk πρέπει επίσης να έχει ρυθμιστεί στο ίδιο μέγεθος για να παρακάμψει τους ελέγχους εγκυρότητας - Για την κατασκευή αυτών των chunks, θα χρειαστείτε ένα heap leak. ### Attack - Δημιουργείται ένα ψεύτικο chunk μέσα σε ένα chunk που ελέγχεται από τον επιτιθέμενο, δείχνοντας με `fd` και `bk` στο αρχικό chunk για να παρακάμψει τις προστασίες - 2 άλλα chunks (`B` και `C`) δεσμεύονται - Κακοποιώντας το off by one στο `B`, το bit `prev in use` καθαρίζεται και τα δεδομένα `prev_size` αντικαθίστανται με τη διαφορά μεταξύ του σημείου όπου δεσμεύεται το chunk `C`, στο ψεύτικο chunk `A` που δημιουργήθηκε προηγουμένως - Αυτό το `prev_size` και το μέγεθος στο ψεύτικο chunk `A` πρέπει να είναι τα ίδια για να παρακάμψουν τους ελέγχους. - Στη συνέχεια, γεμίζεται το tcache - Στη συνέχεια, το `C` απελευθερώνεται ώστε να ενοποιηθεί με το ψεύτικο chunk `A` - Στη συνέχεια, δημιουργείται ένα νέο chunk `D` το οποίο θα ξεκινά στο ψεύτικο chunk `A` και θα καλύπτει το chunk `B` - Το house of Einherjar τελειώνει εδώ - Αυτό μπορεί να συνεχιστεί με μια γρήγορη επίθεση bin ή Tcache poisoning: - Απελευθερώστε το `B` για να το προσθέσετε στο γρήγορο bin / Tcache - Το `fd` του `B` αντικαθίσταται κάνοντάς το να δείχνει στη στοχευμένη διεύθυνση κακοποιώντας το chunk `D` (καθώς περιέχει το `B` μέσα) - Στη συνέχεια, γίνονται 2 mallocs και το δεύτερο θα είναι **δεσμεύοντας τη στοχευμένη διεύθυνση** ## References and other examples - [https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c) - **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_einherjar/#2016-seccon-tinypad) - Μετά την απελευθέρωση των δεικτών τους δεν μηδενίζονται, οπότε είναι ακόμα δυνατή η πρόσβαση στα δεδομένα τους. Επομένως, ένα chunk τοποθετείται στο unsorted bin και διαρρέει τους δείκτες που περιέχει (libc leak) και στη συνέχεια μια νέα heap τοποθετείται στο unsorted bin και διαρρέει μια διεύθυνση heap από τον δείκτη που αποκτά. - [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/) - Null-byte overflow bug στο `strtok`. - Χρησιμοποιήστε το House of Einherjar για να αποκτήσετε μια κατάσταση επικαλυπτόμενων chunks και να τελειώσετε με Tcache poisoning για να αποκτήσετε μια αυθαίρετη γραφή primitive. {{#include ../../banners/hacktricks-training.md}}