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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Βασικές Πληροφορίες
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
Κατάχρηση του GOT από Heap
Ένας κοινός τρόπος για να αποκτήσετε RCE από μια ευπάθεια heap είναι να καταχραστείτε ένα fastbin ώστε να είναι δυνατό να προσθέσετε το μέρος του πίνακα GOT στο fast bin, έτσι ώστε κάθε φορά που αυτό το τμήμα κατανεμηθεί θα είναι δυνατό να επικαλύψετε τον δείκτη μιας συνάρτησης, συνήθως free
.
Στη συνέχεια, δείχνοντας το free
στη system
και απελευθερώνοντας ένα τμήμα όπου γράφτηκε το /bin/sh\x00
θα εκτελέσει ένα shell.
Είναι δυνατό να βρείτε ένα παράδειγμα εδώ.
Προστασίες
Η προστασία Full RELRO προορίζεται να προστατεύει από αυτού του είδους την τεχνική επιλύοντας όλες τις διευθύνσεις των συναρτήσεων όταν ξεκινά το δυαδικό αρχείο και καθιστώντας τον πίνακα GOT μόνο για ανάγνωση μετά από αυτό:
Αναφορές
- https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.