Stack Overflow
Τι είναι η Υπερχείλιση Στοίβας
Η υπερχείλιση στοίβας είναι μια ευπάθεια που συμβαίνει όταν ένα πρόγραμμα γράφει περισσότερα δεδομένα στη στοίβα από ό,τι έχει εκχωρηθεί για να κρατήσει. Αυτά τα περισσότερα δεδομένα θα αντικαταστήσουν τον δίπλα μνημονικό χώρο, οδηγώντας στη διαφθορά έγκυρων δεδομένων, στη διαταραχή της ροής ελέγχου και ενδεχομένως στην εκτέλεση κακόβουλου κώδικα. Αυτό το πρόβλημα προκύπτει συχνά λόγω της χρήσης μη ασφαλών συναρτήσεων που δεν πραγματοποιούν έλεγχο ορίων στην είσοδο.
Το κύριο πρόβλημα αυτής της υπερχείλισης είναι ότι ο αποθηκευμένος δείκτης οδηγιών (EIP/RIP) και ο αποθηκευμένος δείκτης βάσης (EBP/RBP) για την επιστροφή στην προηγούμενη συνάρτηση αποθηκεύονται στη στοίβα. Επομένως, ένας επιτιθέμενος θα μπορεί να αντικαταστήσει αυτούς και να ελέγξει τη ροή εκτέλεσης του προγράμματος.
Η ευπάθεια συνήθως προκύπτει επειδή μια συνάρτηση αντιγράφει μέσα στη στοίβα περισσότερα bytes από την ποσότητα που έχει εκχωρηθεί γι' αυτήν, επομένως μπορεί να αντικαταστήσει άλλα τμήματα της στοίβας.
Κάποιες συνήθεις συναρτήσεις ευάλωτες σε αυτό είναι: strcpy
, strcat
, sprintf
, gets
... Επίσης, συναρτήσεις όπως fgets
, read
& memcpy
που παίρνουν ένα όριο μήκους, μπορεί να χρησιμοποιηθούν με ευπάθη τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το εκχωρημένο.
Για παράδειγμα, οι ακόλουθες συναρτήσεις θα μπορούσαν να είναι ευάλωτες:
Εύρεση αντιστοιχιών υπερχείλισης στο stack
Ο πιο συνηθισμένος τρόπος για να βρείτε αντιστοιχίες υπερχείλισης στο stack είναι να δώσετε ένα πολύ μεγάλο είσοδο από A
(π.χ. python3 -c 'print("A"*1000)'
) και να περιμένετε ένα Segmentation Fault
που υποδηλώνει ότι προσπαθήθηκε να προσπεράσει η διεύθυνση 0x41414141
.
Επιπλέον, αφού εντοπίσετε ότι υπάρχει ευπάθεια στο stack, θα χρειαστεί να βρείτε την αντιστοίχιση μέχρι να είναι δυνατόν να αντικαταστήσετε τη διεύθυνση επιστροφής, για αυτό συνήθως χρησιμοποιείται μια ακολουθία De Bruijn. Η οποία για ένα δεδομένο αλφάβητο μεγέθους k και υποακολουθίες μήκους n είναι μια κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους n** εμφανίζεται ακριβώς μία φορά** ως μια συνεχής υποακολουθία.
Με αυτόν τον τρόπο, αντί να χρειάζεται να καθορίσετε με το χέρι ποια αντιστοίχιση χρειάζεται για να ελέγξετε το EIP, είναι δυνατό να χρησιμοποιηθεί μια από αυτές τις ακολουθίες ως πλαίσιο και στη συνέχεια να βρεθεί η αντιστοίχιση των bytes που τελικά την αντικατέστησαν.
Είναι δυνατό να χρησιμοποιηθεί το pwntools γι' αυτό:
ή GEF:
Εκμετάλλευση Υπερχείλισης Στοίβας
Κατά τη διάρκεια μιας υπερχείλισης (υποθέτοντας ότι το μέγεθος της υπερχείλισης είναι αρκετά μεγάλο) θα μπορείτε να αντικαταστήσετε τιμές τοπικών μεταβλητών μέσα στη στοίβα μέχρι να φτάσετε τα αποθηκευμένα EBP/RBP και EIP/RIP (ή ακόμα και περισσότερα). Ο πιο συνηθισμένος τρόπος εκμετάλλευσης αυτού του τύπου ευπαθειών είναι με το τροποποίηση της διεύθυνσης επιστροφής έτσι ώστε όταν η συνάρτηση τελειώσει, η ροή ελέγχου θα ανακατευθυνθεί όπου ο χρήστης καθόρισε σε αυτό το δείκτη.
Ωστόσο, σε άλλα σενάρια ίσως απλά η αντικατάσταση μερικών τιμών μεταβλητών στη στοίβα είναι αρκετή για την εκμετάλλευση (όπως σε εύκολες προκλήσεις CTF).
Ret2win
Σε αυτού του τύπου προκλήσεις CTF, υπάρχει μια συνάρτηση μέσα στο δυαδικό που ποτέ δεν καλείται και πρέπει να καλέσετε για να κερδίσετε. Για αυτές τις προκλήσεις απλά πρέπει να βρείτε τη μετατόπιση για την αντικατάσταση της διεύθυνσης επιστροφής και να βρείτε τη διεύθυνση της συνάρτησης που πρέπει να καλέσετε (συνήθως το ASLR θα είναι απενεργοποιημένο) έτσι ώστε όταν η ευάλωτη συνάρτηση επιστρέψει, η κρυφή συνάρτηση θα κληθεί:
pageRet2winShellcode Στοίβας
Σε αυτό το σενάριο, ο επιτιθέμενος μπορεί να τοποθετήσει ένα shellcode στη στοίβα και να εκμεταλλευτεί τον ελεγχόμενο EIP/RIP για να μεταβεί στο shellcode και να εκτελέσει αυθαίρετο κώδικα:
pageStack ShellcodeROP & Τεχνικές Ret2...
Αυτή η τεχνική είναι το θεμέλιο πλαίσιο για να παρακάμψετε την κύρια προστασία στην προηγούμενη τεχνική: Μη εκτελέσιμη στοίβα (NX). Και επιτρέπει την εκτέλεση πολλών άλλων τεχνικών (ret2lib, ret2syscall...) που θα οδηγήσουν στην εκτέλεση αυθαίρετων εντολών εκμεταλλευόμενοι υπάρχουσες οδηγίες στο δυαδικό:
pageROP - Return Oriented ProgramingΤύποι προστασιών
Υπάρχουν πολλές προστασίες που προσπαθούν να αποτρέψουν την εκμετάλλευση ευπαθειών, ελέγξτε τις στο:
pageCommon Binary Exploitation Protections & BypassesLast updated