8.9 KiB
WWW2Exec - GOT/PLT
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα τηλεγραφήματος ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα αποθετήρια του HackTricks και του HackTricks Cloud.
Βασικές Πληροφορίες
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 0xDIR_GOT
Χρησιμοποιώντας το GEF μπορείτε να ξεκινήσετε μια συνεδρία αποσφαλμάτωσης και να εκτελέσετε το got
για να δείτε τον πίνακα got:
GOT2Exec
Σε ένα δυαδικό ο GOT έχει τις διευθύνσεις των συναρτήσεων ή της ενότητας PLT που θα φορτώσει τη διεύθυνση της συνάρτησης. Ο στόχος αυτής της αυθαίρετης εγγραφής είναι να αντικαταστήσετε μια καταχώρηση GOT μιας συνάρτησης που θα εκτελεστεί αργότερα με τη διεύθυνση της PLT της συνάρτησης system
για παράδειγμα.
Ιδανικά, θα αντικαταστήσετε το GOT μιας συνάρτησης που θα κληθεί με παραμέτρους που ελέγχετε εσείς (ώστε να μπορείτε να ελέγξετε τις παραμέτρους που στέλνονται στη συνάρτηση συστήματος).
Αν η system
δεν χρησιμοποιείται από το σενάριο, η συνάρτηση συστήματος δεν θα έχει μια καταχώρηση στο PLT. Σε αυτό το σενάριο, θα χρειαστεί να διαρρεύσετε πρώτα τη διεύθυνση της συνάρτησης system
και στη συνέχεια να αντικαταστήσετε το GOT για να δείχνει σε αυτή τη διεύθυνση.
Μπορείτε να δείτε τις διευθύνσεις PLT με objdump -j .plt -d ./vuln_binary
Καταχωρήσεις GOT της libc
Ο GOT της libc συνήθως μεταγλωττίζεται με μερικό RELRO, κάνοντάς το ένα καλό στόχο για αυτό υποθέτοντας ότι είναι δυνατό να βρεθεί η διεύθυνσή του (ASLR).
Συνήθεις συναρτήσεις της libc θα καλέσουν άλλες εσωτερικές συναρτήσεις των οποίων ο GOT θα μπορούσε να αντικατασταθεί για να επιτευχθεί εκτέλεση κώδικα.
Βρείτε περισσότερες πληροφορίες για αυτή την τεχνική εδώ.
One Gadget
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}
Προστασίες
Η προστασία Full RELRO έχει σκοπό να προστατεύσει από αυτού του είδους την τεχνική επιλύοντας όλες τις διευθύνσεις των συναρτήσεων όταν το δυαδικό ξεκινά και καθιστώντας τον πίνακα GOT μόνο για ανάγνωση μετά από αυτό:
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}