Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfΒασικές Πληροφορίες
Το ret2csu είναι μια τεχνική χάκινγκ που χρησιμοποιείται όταν προσπαθείτε να πάρετε τον έλεγχο ενός προγράμματος αλλά δεν μπορείτε να βρείτε τα gadgets που συνήθως χρησιμοποιείτε για να χειριστείτε τη συμπεριφορά του προγράμματος.
Όταν ένα πρόγραμμα χρησιμοποιεί κάποιες βιβλιοθήκες (όπως η libc), έχει μερικές ενσωματωμένες λειτουργίες για τη διαχείριση του πώς διάφορα κομμάτια του προγράμματος επικοινωνούν μεταξύ τους. Ανάμεσα σε αυτές τις λειτουργίες υπάρχουν μερικά κρυμμένα κειμήλια που μπορούν να λειτουργήσουν ως τα λείποντα gadgets μας, ειδικά ένα που ονομάζεται __libc_csu_init
.
Τα Μαγικά Gadgets στο __libc_csu_init
Στο __libc_csu_init
, υπάρχουν δύο ακολουθίες εντολών (gadgets) που ξεχωρίζουν:
Η πρώτη ακολουθία μας επιτρέπει να ρυθμίσουμε τιμές σε διάφορους καταχωρητές (rbx, rbp, r12, r13, r14, r15). Αυτοί είναι σαν υποδοχές όπου μπορούμε να αποθηκεύσουμε αριθμούς ή διευθύνσεις που θέλουμε να χρησιμοποιήσουμε αργότερα.
Αυτό το εργαλείο μας επιτρέπει να ελέγχουμε αυτούς τους registries παίρνοντας τιμές από τη στοίβα και τις τοποθετεί σε αυτά.
Η δεύτερη ακολουθία χρησιμοποιεί τις τιμές που έχουμε ορίσει για να κάνει μερικά πράγματα:
Μεταφορά συγκεκριμένων τιμών σε άλλα registries, κάνοντάς τα έτοιμα για να τα χρησιμοποιήσουμε ως παραμέτρους σε συναρτήσεις.
Εκτέλεση κλήσης σε μια τοποθεσία που καθορίζεται από την πρόσθεση των τιμών στο r15 και στο rbx, και στη συνέχεια πολλαπλασιασμό του rbx με 8.
Ίσως δεν ξέρεις καμία διεύθυνση για να γράψεις εκεί και χρειάζεσαι μια εντολή
ret
. Σημείωσε ότι το δεύτερο εργαλείο θα τελειώσει επίσης με έναret
, αλλά θα πρέπει να πληροίς κάποιες συνθήκες για να το φτάσεις:
Οι συνθήκες θα είναι:
Το
[r12 + rbx*8]
πρέπει να δείχνει σε μια διεύθυνση που αποθηκεύει μια κλήσιμη συνάρτηση (αν δεν υπάρχει ιδέα και δεν υπάρχει Position Independent Executable, μπορείτε απλά να χρησιμοποιήσετε τη συνάρτηση_init
):Αν η συνάρτηση
_init
βρίσκεται στη διεύθυνση0x400560
, χρησιμοποιήστε το GEF για να αναζητήσετε ένα δείκτη στη μνήμη προς αυτήν και να κάνετε το[r12 + rbx*8]
να είναι η διεύθυνση με το δείκτη προς το_init
:
Τα
rbp
καιrbx
πρέπει να έχουν την ίδια τιμή για να αποφευχθεί το άλμαΥπάρχουν ορισμένα παραλειπόμενα pops που πρέπει να λάβετε υπόψη
RDI και RSI
Ένας άλλος τρόπος για να ελέγξετε τα rdi
και rsi
από το gadget ret2csu είναι προσπελαώντας συγκεκριμένες μετατοπίσεις:
Ελέγξτε αυτή τη σελίδα για περισσότερες πληροφορίες:
pageBROP - Blind Return Oriented ProgrammingΠαράδειγμα
Χρησιμοποιώντας την κλήση
Φανταστείτε ότι θέλετε να κάνετε ένα σύστημα κλήσης ή να καλέσετε μια συνάρτηση όπως η write()
αλλά χρειάζεστε συγκεκριμένες τιμές στα καταχωρητές rdx
και rsi
ως παραμέτρους. Συνήθως, θα αναζητούσατε gadgets που ορίζουν αυτούς τους καταχωρητές απευθείας, αλλά δεν μπορείτε να βρείτε κανένα.
Εδώ είναι που μπαίνει σε παιχνίδι το ret2csu:
Ρύθμιση των Καταχωρητών: Χρησιμοποιήστε το πρώτο μαγικό gadget για να εξάγετε τιμές από τη στοίβα και να τις μεταφέρετε στους rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) και r15.
Χρήση του Δεύτερου Gadget: Με αυτούς τους καταχωρητές ορισμένους, χρησιμοποιείτε το δεύτερο gadget. Αυτό σάς επιτρέπει να μετακινήσετε τις επιλεγμένες τιμές σας στους
rdx
καιrsi
(από r14 και r13 αντίστοιχα), ετοιμάζοντας τις παραμέτρους για μια κλήση συνάρτησης. Επιπλέον, ελέγχοντας τουςr15
καιrbx
, μπορείτε να κάνετε το πρόγραμμα να καλέσει μια συνάρτηση που βρίσκεται στη διεύθυνση που υπολογίζετε και τοποθετείτε στο[r15 + rbx*8]
.
Έχετε ένα παράδειγμα χρησιμοποιώντας αυτή την τεχνική και εξηγώντας την εδώ, και αυτό είναι το τελικό exploit που χρησιμοποιήθηκε:
Σημειώστε ότι το προηγούμενο exploit δεν προορίζεται να κάνει RCE
, αλλά απλά να καλέσει μια συνάρτηση που ονομάζεται win
(παίρνοντας τη διεύθυνση του win
από την είσοδο καλώντας τη gets στη ROP αλυσίδα και αποθηκεύοντάς τη στο r15) με ένα τρίτο όρισμα με την τιμή 0xdeadbeefcafed00d
.
Παράκαμψη της κλήσης και φτάνοντας στο ret
Το παρακάτω exploit εξήχθη από αυτήν τη σελίδα όπου χρησιμοποιείται το ret2csu αλλά αντί να χρησιμοποιεί την κλήση, παρακάμπτει τις συγκρίσεις και φτάνει στο ret
μετά την κλήση:
Γιατί Να Μην Χρησιμοποιήσετε Απευθείας την libc;
Συνήθως αυτές οι περιπτώσεις είναι επίσης ευάλωτες στο ret2plt + ret2lib, αλλά μερικές φορές χρειάζεται να ελέγξετε περισσότερες παραμέτρους από όσες μπορούν να ελεγχθούν εύκολα με τα gadgets που βρίσκετε απευθείας στην libc. Για παράδειγμα, η συνάρτηση write()
απαιτεί τρεις παραμέτρους, και η εύρεση gadgets για να ορίσετε αυτές απευθείας ενδέχεται να μην είναι δυνατή.
Last updated