Stack Overflow
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)
Ένα stack overflow είναι μια ευπάθεια που συμβαίνει όταν ένα πρόγραμμα γράφει περισσότερα δεδομένα στο stack από όσα έχει εκχωρηθεί να κρατήσει. Αυτά τα επιπλέον δεδομένα θα επικαλύψουν τον γειτονικό χώρο μνήμης, οδηγώντας στη διαφθορά έγκυρων δεδομένων, διαταραχή της ροής ελέγχου και ενδεχομένως την εκτέλεση κακόβουλου κώδικα. Αυτό το πρόβλημα προκύπτει συχνά λόγω της χρήσης μη ασφαλών συναρτήσεων που δεν εκτελούν έλεγχο ορίων στην είσοδο.
Το κύριο πρόβλημα αυτής της επικαλύψης είναι ότι ο αποθηκευμένος δείκτης εντολών (EIP/RIP) και ο αποθηκευμένος δείκτης βάσης (EBP/RBP) για να επιστρέψει στην προηγούμενη συνάρτηση είναι αποθηκευμένα στο stack. Επομένως, ένας επιτιθέμενος θα είναι σε θέση να τα επικαλύψει και να ελέγξει τη ροή εκτέλεσης του προγράμματος.
Η ευπάθεια συνήθως προκύπτει επειδή μια συνάρτηση αντιγράφει στο stack περισσότερα byte από την ποσότητα που έχει εκχωρηθεί γι' αυτήν, επομένως μπορεί να επικαλύψει άλλα μέρη του stack.
Ορισμένες κοινές συναρτήσεις που είναι ευάλωτες σε αυτό είναι: strcpy
, strcat
, sprintf
, gets
... Επίσης, συναρτήσεις όπως fgets
, read
& memcpy
που δέχονται ένα όρισμα μήκους, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το εκχωρημένο.
Για παράδειγμα, οι παρακάτω συναρτήσεις θα μπορούσαν να είναι ευάλωτες:
Ο πιο κοινός τρόπος για να βρείτε υπερχειλίσεις στοίβας είναι να δώσετε μια πολύ μεγάλη είσοδο από A
s (π.χ. python3 -c 'print("A"*1000)'
) και να περιμένετε ένα Segmentation Fault
που υποδεικνύει ότι η διεύθυνση 0x41414141
προσπαθήθηκε να προσπελαστεί.
Επιπλέον, μόλις βρείτε ότι υπάρχει ευπάθεια υπερχειλίσεως στοίβας, θα χρειαστεί να βρείτε την απόσταση μέχρι να είναι δυνατή η επικαλυπτική διεύθυνση επιστροφής, για αυτό συνήθως χρησιμοποιείται μια ακολουθία De Bruijn. Η οποία για ένα δεδομένο αλφάβητο μεγέθους k και υποακολουθίες μήκους n είναι μια κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους _n_** εμφανίζεται ακριβώς μία φορά** ως συνεχής υποακολουθία.
Με αυτόν τον τρόπο, αντί να χρειάζεται να καταλάβετε ποια απόσταση είναι απαραίτητη για να ελέγξετε το EIP με το χέρι, είναι δυνατόν να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε την απόσταση των byte που τελείωσαν επικαλύπτοντάς το.
Είναι δυνατόν να χρησιμοποιήσετε pwntools για αυτό:
ή GEF:
Κατά τη διάρκεια μιας υπερχείλισης (υποθέτοντας ότι το μέγεθος της υπερχείλισης είναι αρκετά μεγάλο) θα είστε σε θέση να επικαλύψετε τις τιμές των τοπικών μεταβλητών μέσα στη στοίβα μέχρι να φτάσετε στο αποθηκευμένο EBP/RBP και EIP/RIP (ή ακόμα περισσότερα). Ο πιο κοινός τρόπος για να εκμεταλλευτείτε αυτόν τον τύπο ευπάθειας είναι να τροποποιήσετε τη διεύθυνση επιστροφής έτσι ώστε όταν η συνάρτηση τελειώσει, η ροή ελέγχου να ανακατευθυνθεί όπου ο χρήστης καθόρισε σε αυτόν τον δείκτη.
Ωστόσο, σε άλλα σενάρια, ίσως απλά η επικαλύψη κάποιων τιμών μεταβλητών στη στοίβα να είναι αρκετή για την εκμετάλλευση (όπως σε εύκολες προκλήσεις CTF).
Σε αυτόν τον τύπο προκλήσεων CTF, υπάρχει μια συνάρτηση μέσα στο δυαδικό αρχείο που ποτέ δεν καλείται και που πρέπει να καλέσετε για να κερδίσετε. Για αυτές τις προκλήσεις χρειάζεται απλώς να βρείτε την απόσταση για να επικαλύψετε τη διεύθυνση επιστροφής και να βρείτε τη διεύθυνση της συνάρτησης που θα καλέσετε (συνήθως ASLR θα είναι απενεργοποιημένο) έτσι ώστε όταν η ευάλωτη συνάρτηση επιστρέψει, η κρυφή συνάρτηση θα κληθεί:
Ret2winΣε αυτό το σενάριο, ο επιτιθέμενος θα μπορούσε να τοποθετήσει ένα shellcode στη στοίβα και να εκμεταλλευτεί το ελεγχόμενο EIP/RIP για να μεταπηδήσει στο shellcode και να εκτελέσει αυθαίρετο κώδικα:
Stack ShellcodeΑυτή η τεχνική είναι το θεμελιώδες πλαίσιο για να παρακάμψετε την κύρια προστασία της προηγούμενης τεχνικής: Μη εκτελέσιμη στοίβα (NX). Και επιτρέπει την εκτέλεση αρκετών άλλων τεχνικών (ret2lib, ret2syscall...) που θα καταλήξουν να εκτελούν αυθαίρετες εντολές εκμεταλλευόμενοι υπάρχουσες εντολές στο δυαδικό αρχείο:
ROP - Return Oriented ProgramingΜια υπερχείλιση δεν θα είναι πάντα στη στοίβα, μπορεί επίσης να είναι στον σωρό για παράδειγμα:
Heap OverflowΥπάρχουν πολλές προστασίες που προσπαθούν να αποτρέψουν την εκμετάλλευση ευπαθειών, ελέγξτε τις στο:
Common Binary Exploitation Protections & BypassesΜάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)