WWW2Exec - GOT/PLT
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Η Global Offset Table (GOT) είναι ένας μηχανισμός που χρησιμοποιείται σε δυναμικά συνδεδεμένα δυαδικά αρχεία για να διαχειρίζεται τις διευθύνσεις εξωτερικών συναρτήσεων. Δεδομένου ότι αυτές οι διευθύνσεις δεν είναι γνωστές μέχρι την εκτέλεση (λόγω δυναμικής σύνδεσης), η GOT παρέχει έναν τρόπο για να ενημερώνονται δυναμικά οι διευθύνσεις αυτών των εξωτερικών συμβόλων μόλις επιλυθούν.
Κάθε εγγραφή στην GOT αντιστοιχεί σε ένα σύμβολο στις εξωτερικές βιβλιοθήκες που μπορεί να καλέσει το δυαδικό αρχείο. Όταν μια συνάρτηση καλείται για πρώτη φορά, η πραγματική της διεύθυνση επιλύεται από τον δυναμικό σύνδεσμο και αποθηκεύεται στην GOT. Οι επόμενες κλήσεις στην ίδια συνάρτηση χρησιμοποιούν τη διεύθυνση που αποθηκεύεται στην GOT, αποφεύγοντας έτσι την επιβάρυνση της εκ νέου επίλυσης της διεύθυνσης.
Η Procedure Linkage Table (PLT) συνεργάζεται στενά με την GOT και λειτουργεί ως ένα trampoline για να διαχειρίζεται τις κλήσεις σε εξωτερικές συναρτήσεις. Όταν ένα δυαδικό αρχείο καλεί μια εξωτερική συνάρτηση για πρώτη φορά, ο έλεγχος μεταφέρεται σε μια εγγραφή στην PLT που σχετίζεται με αυτή τη συνάρτηση. Αυτή η εγγραφή PLT είναι υπεύθυνη για την κλήση του δυναμικού συνδέσμου για να επιλύσει τη διεύθυνση της συνάρτησης αν δεν έχει ήδη επιλυθεί. Αφού επιλυθεί η διεύθυνση, αποθηκεύεται στην GOT.
Επομένως, οι εγγραφές GOT χρησιμοποιούνται άμεσα μόλις επιλυθεί η διεύθυνση μιας εξωτερικής συνάρτησης ή μεταβλητής. Οι εγγραφές PLT χρησιμοποιούνται για να διευκολύνουν την αρχική επίλυση αυτών των διευθύνσεων μέσω του δυναμικού συνδέσμου.
Πάρτε τη διεύθυνση του πίνακα GOT με: objdump -s -j .got ./exec
Παρατηρήστε πώς μετά την φόρτωση του εκτελέσιμου στο GEF μπορείτε να δείτε τις συναρτήσεις που είναι στην GOT: gef➤ x/20x 0xADDR_GOT
Χρησιμοποιώντας το GEF μπορείτε να ξεκινήσετε μια συνεδρία αποσφαλμάτωσης και να εκτελέσετε got
για να δείτε τον πίνακα got:
Σε ένα δυαδικό αρχείο, η GOT έχει τις διευθύνσεις στις συναρτήσεις ή στην ενότητα PLT που θα φορτώσει τη διεύθυνση της συνάρτησης. Ο στόχος αυτής της αυθαίρετης εγγραφής είναι να αντικαταστήσει μια εγγραφή GOT μιας συνάρτησης που πρόκειται να εκτελεστεί αργότερα με τη διεύθυνση της PLT της συνάρτησης system
για παράδειγμα.
Ιδανικά, θα αντικαταστήσετε την GOT μιας συνάρτησης που πρόκειται να κληθεί με παραμέτρους που ελέγχετε εσείς (έτσι θα μπορείτε να ελέγξετε τις παραμέτρους που αποστέλλονται στη συνάρτηση system).
Αν η system
δεν χρησιμοποιείται από το δυαδικό αρχείο, η συνάρτηση system δεν θα έχει μια εγγραφή στην PLT. Σε αυτό το σενάριο, θα πρέπει πρώτα να διαρρεύσετε τη διεύθυνση της συνάρτησης system
και στη συνέχεια να αντικαταστήσετε την GOT για να δείξει σε αυτή τη διεύθυνση.
Μπορείτε να δείτε τις διευθύνσεις PLT με objdump -j .plt -d ./vuln_binary
Η GOT της libc συνήθως έχει μεταγλωττιστεί με μερική RELRO, κάνοντάς την έναν ωραίο στόχο για αυτό, υποθέτοντας ότι είναι δυνατό να προσδιοριστεί η διεύθυνσή της (ASLR).
Κοινές συναρτήσεις της libc θα καλέσουν άλλες εσωτερικές συναρτήσεις των οποίων η GOT θα μπορούσε να αντικατασταθεί προκειμένου να αποκτηθεί εκτέλεση κώδικα.
Βρείτε περισσότερες πληροφορίες σχετικά με αυτή την τεχνική εδώ.
Στις εκμεταλλεύσεις heap CTFs είναι κοινό να μπορείτε να ελέγξετε το περιεχόμενο των chunks και σε κάποιο σημείο ακόμη και να αντικαταστήσετε τον πίνακα GOT. Ένα απλό κόλπο για να αποκτήσετε RCE αν δεν είναι διαθέσιμα gadgets είναι να αντικαταστήσετε τη διεύθυνση GOT του free
για να δείξει στη system
και να γράψετε μέσα σε ένα chunk "/bin/sh"
. Με αυτόν τον τρόπο, όταν αυτό το chunk απελευθερωθεί, θα εκτελέσει system("/bin/sh")
.
Μια άλλη κοινή τεχνική είναι να αντικαταστήσετε τη διεύθυνση GOT της strlen
για να δείξει στη system
, έτσι αν αυτή η συνάρτηση κληθεί με είσοδο χρήστη είναι δυνατό να περάσετε τη συμβολοσειρά "/bin/sh"
και να αποκτήσετε ένα shell.
Επιπλέον, αν η puts
χρησιμοποιείται με είσοδο χρήστη, είναι δυνατό να αντικαταστήσετε τη διεύθυνση GOT της strlen
για να δείξει στη system
και να περάσετε τη συμβολοσειρά "/bin/sh"
για να αποκτήσετε ένα shell, επειδή η puts
θα καλέσει τη strlen
με την είσοδο χρήστη.
Ένας κοινός τρόπος για να αποκτήσετε RCE από μια ευπάθεια heap είναι να εκμεταλλευτείτε ένα fastbin έτσι ώστε να είναι δυνατό να προσθέσετε το μέρος του πίνακα GOT στο fast bin, έτσι ώστε κάθε φορά που αυτό το chunk κατανέμεται να είναι δυνατό να αντικαταστήσετε τον δείκτη μιας συνάρτησης, συνήθως του free
.
Στη συνέχεια, δείχνοντας το free
στη system
και απελευθερώνοντας ένα chunk όπου γράφτηκε το /bin/sh\x00
θα εκτελέσει ένα shell.
Είναι δυνατό να βρείτε ένα παράδειγμα εδώ.
Η προστασία Full RELRO προορίζεται να προστατεύει από αυτού του είδους την τεχνική επιλύοντας όλες τις διευθύνσεις των συναρτήσεων όταν το δυαδικό αρχείο ξεκινά και κάνοντάς τον πίνακα GOT μόνο για ανάγνωση μετά από αυτό:
RelroLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)