WWW2Exec - GOT/PLT

Reading time: 6 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

Βασικές Πληροφορίες

GOT: Παγκόσμιος Πίνακας Μεταθέσεων

Ο Παγκόσμιος Πίνακας Μεταθέσεων (GOT) είναι ένας μηχανισμός που χρησιμοποιείται σε δυναμικά συνδεδεμένα δυαδικά αρχεία για τη διαχείριση των διευθύνσεων εξωτερικών συναρτήσεων. Δεδομένου ότι αυτές οι διευθύνσεις δεν είναι γνωστές μέχρι την εκτέλεση (λόγω δυναμικής σύνδεσης), ο GOT παρέχει έναν τρόπο για να ενημερώνονται δυναμικά οι διευθύνσεις αυτών των εξωτερικών συμβόλων μόλις επιλυθούν.

Κάθε είσοδος στον GOT αντιστοιχεί σε ένα σύμβολο στις εξωτερικές βιβλιοθήκες που μπορεί να καλέσει το δυαδικό αρχείο. Όταν μια συνάρτηση καλείται για πρώτη φορά, η πραγματική της διεύθυνση επιλύεται από τον δυναμικό σύνδεσμο και αποθηκεύεται στον GOT. Οι επόμενες κλήσεις στην ίδια συνάρτηση χρησιμοποιούν τη διεύθυνση που αποθηκεύεται στον GOT, αποφεύγοντας έτσι το κόστος της εκ νέου επίλυσης της διεύθυνσης.

PLT: Πίνακας Σύνδεσης Διαδικασιών

Ο Πίνακας Σύνδεσης Διαδικασιών (PLT) συνεργάζεται στενά με τον GOT και λειτουργεί ως ελατήριο για να χειρίζεται τις κλήσεις σε εξωτερικές συναρτήσεις. Όταν ένα δυαδικό αρχείο καλεί μια εξωτερική συνάρτηση για πρώτη φορά, ο έλεγχος μεταφέρεται σε μια είσοδο στον PLT που σχετίζεται με αυτή τη συνάρτηση. Αυτή η είσοδος PLT είναι υπεύθυνη για την κλήση του δυναμικού συνδέσμου για να επιλύσει τη διεύθυνση της συνάρτησης αν δεν έχει ήδη επιλυθεί. Αφού επιλυθεί η διεύθυνση, αποθηκεύεται στον GOT.

Επομένως, οι είσοδοι του GOT χρησιμοποιούνται άμεσα μόλις επιλυθεί η διεύθυνση μιας εξωτερικής συνάρτησης ή μεταβλητής. Οι είσοδοι του PLT χρησιμοποιούνται για να διευκολύνουν την αρχική επίλυση αυτών των διευθύνσεων μέσω του δυναμικού συνδέσμου.

Λάβετε Εκτέλεση

Ελέγξτε τον GOT

Λάβετε τη διεύθυνση του πίνακα GOT με: objdump -s -j .got ./exec

Παρατηρήστε πώς μετά την φόρτωση του εκτελέσιμου στο GEF μπορείτε να δείτε τις συναρτήσεις που είναι στον GOT: gef➤ x/20x 0xADDR_GOT

Χρησιμοποιώντας το GEF μπορείτε να ξεκινήσετε μια συνεδρία αποσφαλμάτωσης και να εκτελέσετε got για να δείτε τον πίνακα got:

GOT2Exec

Σε ένα δυαδικό αρχείο, ο GOT έχει τις διευθύνσεις στις συναρτήσεις ή στην ενότητα PLT που θα φορτώσει τη διεύθυνση της συνάρτησης. Ο στόχος αυτής της αυθαίρετης εγγραφής είναι να αντικαταστήσει μια είσοδο GOT μιας συνάρτησης που πρόκειται να εκτελεστεί αργότερα με τη διεύθυνση του PLT της συνάρτησης system για παράδειγμα.

Ιδανικά, θα αντικαταστήσετε τον GOT μιας συνάρτησης που θα κληθεί με παραμέτρους που ελέγχετε εσείς (έτσι θα μπορείτε να ελέγξετε τις παραμέτρους που αποστέλλονται στη συνάρτηση system).

Αν η system δεν χρησιμοποιείται από το δυαδικό αρχείο, η συνάρτηση system δεν θα έχει μια είσοδο στον PLT. Σε αυτό το σενάριο, θα πρέπει πρώτα να διαρρεύσετε τη διεύθυνση της συνάρτησης system και στη συνέχεια να αντικαταστήσετε τον GOT για να δείξει σε αυτή τη διεύθυνση.

Μπορείτε να δείτε τις διευθύνσεις PLT με objdump -j .plt -d ./vuln_binary

Είσοδοι GOT της libc

Ο GOT της libc συνήθως έχει μεταγλωττιστεί με μερική RELRO, καθιστώντας τον έναν ωραίο στόχο για αυτό, υποθέτοντας ότι είναι δυνατό να προσδιοριστεί η διεύθυνσή του (ASLR).

Κοινές συναρτήσεις της libc θα καλέσουν άλλες εσωτερικές συναρτήσεις των οποίων ο GOT θα μπορούσε να αντικατασταθεί προκειμένου να αποκτηθεί εκτέλεση κώδικα.

Βρείτε περισσότερες πληροφορίες σχετικά με αυτή την τεχνική εδώ.

Free2system

Στην εκμετάλλευση heap CTFs είναι κοινό να μπορείτε να ελέγξετε το περιεχόμενο των τμημάτων και σε κάποιο σημείο ακόμη και να αντικαταστήσετε τον πίνακα GOT. Ένα απλό κόλπο για να αποκτήσετε RCE αν δεν είναι διαθέσιμα gadgets είναι να αντικαταστήσετε τη διεύθυνση GOT του free για να δείξει στη system και να γράψετε μέσα σε ένα τμήμα "/bin/sh". Με αυτόν τον τρόπο, όταν αυτό το τμήμα απελευθερωθεί, θα εκτελέσει system("/bin/sh").

Strlen2system

Μια άλλη κοινή τεχνική είναι να αντικαταστήσετε τη διεύθυνση GOT της strlen για να δείξει στη system, έτσι ώστε αν αυτή η συνάρτηση κληθεί με είσοδο χρήστη, είναι δυνατό να περάσετε τη συμβολοσειρά "/bin/sh" και να αποκτήσετε ένα shell.

Επιπλέον, αν η puts χρησιμοποιείται με είσοδο χρήστη, είναι δυνατό να αντικαταστήσετε τη διεύθυνση GOT της strlen για να δείξει στη system και να περάσετε τη συμβολοσειρά "/bin/sh" για να αποκτήσετε ένα shell, επειδή η puts θα καλέσει τη strlen με την είσοδο χρήστη.

One Gadget

One Gadget

Κατάχρηση του GOT από Heap

Ένας κοινός τρόπος για να αποκτήσετε RCE από μια ευπάθεια heap είναι να καταχραστείτε ένα fastbin, έτσι ώστε να είναι δυνατό να προσθέσετε το μέρος του πίνακα GOT στο fast bin, έτσι ώστε κάθε φορά που αυτό το τμήμα κατανέμεται να είναι δυνατό να αντικαταστήσετε τον δείκτη μιας συνάρτησης, συνήθως free.
Στη συνέχεια, δείχνοντας τη free στη system και απελευθερώνοντας ένα τμήμα όπου γράφτηκε το /bin/sh\x00 θα εκτελέσει ένα shell.

Είναι δυνατό να βρείτε ένα παράδειγμα εδώ.

Προστασίες

Η προστασία Full RELRO προορίζεται να προστατεύει από αυτού του είδους την τεχνική επιλύοντας όλες τις διευθύνσεις των συναρτήσεων όταν ξεκινά το δυαδικό αρχείο και καθιστώντας τον πίνακα GOT μόνο για ανάγνωση μετά από αυτό:

Relro

Αναφορές

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