Ret2win
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)
Οι προκλήσεις Ret2win είναι μια δημοφιλής κατηγορία σε διαγωνισμούς Capture The Flag (CTF), ιδιαίτερα σε εργασίες που περιλαμβάνουν binary exploitation. Ο στόχος είναι να εκμεταλλευτούμε μια ευπάθεια σε ένα δεδομένο δυαδικό αρχείο για να εκτελέσουμε μια συγκεκριμένη, μη κληθείσα συνάρτηση μέσα στο δυαδικό, συχνά ονομαζόμενη κάτι σαν win
, flag
, κ.λπ. Αυτή η συνάρτηση, όταν εκτελείται, συνήθως εκτυπώνει μια σημαία ή ένα μήνυμα επιτυχίας. Η πρόκληση περιλαμβάνει συνήθως την επαναγραφή της διεύθυνσης επιστροφής στη στοίβα για να κατευθύνει τη ροή εκτέλεσης στη επιθυμητή συνάρτηση. Ακολουθεί μια πιο λεπτομερής εξήγηση με παραδείγματα:
Σκεφτείτε ένα απλό πρόγραμμα C με μια ευπάθεια και μια συνάρτηση win
που σκοπεύουμε να καλέσουμε:
Για να μεταγλωττίσετε αυτό το πρόγραμμα χωρίς προστασίες στο stack και με το ASLR απενεργοποιημένο, μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή:
-m32
: Συγκεντρώστε το πρόγραμμα ως 32-bit δυαδικό (αυτό είναι προαιρετικό αλλά κοινό σε προκλήσεις CTF).
-fno-stack-protector
: Απενεργοποιήστε τις προστασίες κατά των υπερχειλίσεων στο στοίβας.
-z execstack
: Επιτρέψτε την εκτέλεση κώδικα στη στοίβα.
-no-pie
: Απενεργοποιήστε το Position Independent Executable για να διασφαλίσετε ότι η διεύθυνση της συνάρτησης win
δεν αλλάζει.
-o vulnerable
: Ονομάστε το αρχείο εξόδου vulnerable
.
Για την εκμετάλλευση, θα χρησιμοποιήσουμε pwntools, ένα ισχυρό πλαίσιο CTF για τη συγγραφή εκμεταλλεύσεων. Το σενάριο εκμετάλλευσης θα δημιουργήσει ένα payload για να υπερχειλίσει το buffer και να αντικαταστήσει τη διεύθυνση επιστροφής με τη διεύθυνση της συνάρτησης win
.
Για να βρείτε τη διεύθυνση της συνάρτησης win
, μπορείτε να χρησιμοποιήσετε gdb, objdump ή οποιοδήποτε άλλο εργαλείο που σας επιτρέπει να επιθεωρείτε δυαδικά αρχεία. Για παράδειγμα, με το objdump
, μπορείτε να χρησιμοποιήσετε:
Αυτή η εντολή θα σας δείξει τη συναρμολόγηση της συνάρτησης win
, συμπεριλαμβανομένης της διεύθυνσης εκκίνησής της.
Το σενάριο Python στέλνει ένα προσεκτικά κατασκευασμένο μήνυμα που, όταν επεξεργαστεί από τη vulnerable_function
, υπερχειλίζει το buffer και αντικαθιστά τη διεύθυνση επιστροφής στο stack με τη διεύθυνση της win
. Όταν η vulnerable_function
επιστρέφει, αντί να επιστρέψει στη main
ή να τερματίσει, πηδά στη win
, και το μήνυμα εκτυπώνεται.
PIE θα πρέπει να είναι απενεργοποιημένο για να είναι η διεύθυνση αξιόπιστη σε όλες τις εκτελέσεις ή η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστείτε κάποια leak για να καταλάβετε πού είναι φορτωμένη η συνάρτηση win. Σε ορισμένες περιπτώσεις, όταν η συνάρτηση που προκαλεί την υπερχείλιση είναι read
ή παρόμοια, μπορείτε να κάνετε μια Μερική Υπεργραφή 1 ή 2 byte για να αλλάξετε τη διεύθυνση επιστροφής ώστε να είναι η συνάρτηση win. Λόγω του πώς λειτουργεί το ASLR, τα τελευταία τρία hex nibbles δεν είναι τυχαία, οπότε υπάρχει μια 1/16 πιθανότητα (1 nibble) να αποκτήσετε τη σωστή διεύθυνση επιστροφής.
Stack Canaries θα πρέπει επίσης να είναι απενεργοποιημένα ή η συμβιβασμένη διεύθυνση επιστροφής EIP δεν θα ακολουθηθεί ποτέ.
32bit, χωρίς ASLR
64 bits με ASLR, με ένα leak της διεύθυνσης bin
64 bits, χωρίς ASLR
32 bits, χωρίς ASLR, διπλή μικρή υπερχείλιση, πρώτα για να υπερχειλίσει το stack και να αυξήσει το μέγεθος της δεύτερης υπερχείλισης
32 bit, relro, χωρίς canary, nx, χωρίς pie, μορφή συμβολοσειράς για να αντικαταστήσει τη διεύθυνση fflush
με τη συνάρτηση win (ret2win)
32 bit, nx, τίποτα άλλο, μερική υπερχείλιση του EIP (1Byte) για να καλέσει τη συνάρτηση win
32 bit, nx, τίποτα άλλο, μερική υπερχείλιση του EIP (1Byte) για να καλέσει τη συνάρτηση win
Το πρόγραμμα επικυρώνει μόνο το τελευταίο byte ενός αριθμού για να ελέγξει το μέγεθος της εισόδου, επομένως είναι δυνατό να προσθέσετε οποιοδήποτε μέγεθος όσο το τελευταίο byte είναι εντός του επιτρεπόμενου εύρους. Στη συνέχεια, η είσοδος δημιουργεί μια υπερχείλιση buffer που εκμεταλλεύεται με ένα ret2win.
64 bit, relro, χωρίς canary, nx, pie. Μερική υπερχείλιση για να καλέσει τη συνάρτηση win (ret2win)
arm64, PIE, δίνει ένα leak PIE η συνάρτηση win είναι στην πραγματικότητα 2 συναρτήσεις οπότε ROP gadget που καλεί 2 συναρτήσεις
ARM64, off-by-one για να καλέσει μια συνάρτηση win
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)