SROP - Sigreturn-Oriented Programming
Βασικές Πληροφορίες
Το Sigreturn
είναι ένα ειδικό syscall που χρησιμοποιείται κυρίως για τον καθαρισμό μετά την ολοκλήρωση ενός χειριστή σήματος. Τα σήματα είναι διακοπές που στέλνονται σε ένα πρόγραμμα από το λειτουργικό σύστημα, συχνά για να υποδείξουν ότι έχει συμβεί κάποια εξαιρετική κατάσταση. Όταν ένα πρόγραμμα λαμβάνει ένα σήμα, παύει προσωρινά την τρέχουσα εργασία του για να χειριστεί το σήμα με έναν χειριστή σήματος, μια ειδική συνάρτηση σχεδιασμένη για να αντιμετωπίζει τα σήματα.
Μετά την ολοκλήρωση του χειριστή σήματος, το πρόγραμμα πρέπει να επαναφέρει την προηγούμενη κατάστασή του ως να μην συνέβη τίποτα. Εδώ είναι που εμφανίζεται το sigreturn
. Βοηθά το πρόγραμμα να επιστρέψει από τον χειριστή σήματος και επαναφέρει την κατάσταση του προγράμματος καθαρίζοντας το πλαίσιο στοίβας (η ενότητα μνήμης που αποθηκεύει κλήσεις συναρτήσεων και τοπικές μεταβλητές) που χρησιμοποιήθηκε από τον χειριστή σήματος.
Το ενδιαφέρον μέρος είναι πώς το sigreturn
επαναφέρει την κατάσταση του προγράμματος: το κάνει αυτό αποθηκεύοντας όλες τις τιμές των καταχωρητών της CPU στη στοίβα. Όταν το σήμα δεν είναι πλέον μπλοκαρισμένο, το sigreturn
απομακρύνει αυτές τις τιμές από τη στοίβα, επαναφέροντας αποτελεσματικά τους καταχωρητές της CPU στην κατάστασή τους πριν το χειρισμό του σήματος. Αυτό περιλαμβάνει τον καταχωρητή δείκτη στοίβας (RSP), που δείχνει στην τρέχουσα κορυφή της στοίβας.
Καλώντας το syscall sigreturn
από μια ROP αλυσίδα και προσθέτοντας τις τιμές των καταχωρητών που θα θέλαμε να φορτώσει στη στοίβα είναι δυνατό να ελέγξουμε όλες τις τιμές των καταχωρητών και συνεπώς να καλέσουμε για παράδειγμα το syscall execve
με /bin/sh
.
Σημειώστε πώς αυτό θα ήταν ένας τύπος Ret2syscall που καθιστά πολύ πιο εύκολο τον έλεγχο των παραμέτρων για να καλέσει άλλους Ret2syscalls:
pageRet2syscallΑν είστε περίεργοι, αυτή είναι η δομή sigcontext που αποθηκεύεται στη στοίβα για να ανακτήσει αργότερα τις τιμές (διάγραμμα από εδώ):
Για μια καλύτερη εξήγηση, ελέγξτε επίσης:
Παράδειγμα
Μπορείτε να βρείτε ένα παράδειγμα εδώ όπου η κλήση στο signeturn κατασκευάζεται μέσω ROP (βάζοντας στο rxa την τιμή 0xf
), αν και αυτό είναι το τελικό exploit από εκεί:
Ελέγξτε επίσης το exploit από εδώ όπου το δυαδικό αρχείο καλούσε ήδη το sigreturn
και επομένως δεν είναι απαραίτητο να το χτίσετε με ένα ROP:
Άλλα Παραδείγματα & Αναφορές
Αρχείο συναρμολόγησης που επιτρέπει την εγγραφή στη στοίβα και στη συνέχεια καλεί την κλήση συστήματος
sigreturn
. Είναι δυνατόν να γραφτεί στη στοίβα ένα ret2syscall μέσω μιας δομής sigreturn και να διαβαστεί η σημαία που βρίσκεται μέσα στη μνήμη του αρχείου εκτέλεσης.Αρχείο συναρμολόγησης που επιτρέπει την εγγραφή στη στοίβα και στη συνέχεια καλεί την κλήση συστήματος
sigreturn
. Είναι δυνατόν να γραφτεί στη στοίβα ένα ret2syscall μέσω μιας δομής sigreturn (το αρχείο εκτέλεσης περιέχει τη συμβολοσειρά/bin/sh
).64 bits, χωρίς relro, χωρίς canary, nx, χωρίς pie. Απλή υπερχείλιση buffer καταχρώμενη τη λειτουργία
gets
με έλλειψη gadgets που εκτελούν ένα ret2syscall. Η ROP αλυσίδα γράφει το/bin/sh
στην.bss
καλώντας ξανά τη gets, καταχρώμενη τη λειτουργίαalarm
για να ορίσει τον eax σε0xf
για να καλέσει ένα SROP και να εκτελέσει ένα κέλυφος.Πρόγραμμα συναρμολόγησης 64 bits, χωρίς relro, χωρίς canary, nx, χωρίς pie. Η ροή επιτρέπει την εγγραφή στη στοίβα, τον έλεγχο πολλών καταχωρητών και την κλήση ενός συστήματος και στη συνέχεια καλεί την
exit
. Η επιλεγμένη κλήση συστήματος είναι μιαsigreturn
που θα ορίσει καταχωρητές και θα μετακινήσει τοeip
για να καλέσει μια προηγούμενη εντολή συστήματος και να εκτελέσει τοmemprotect
για να ορίσει το χώρο του αρχείου εκτέλεσης σεrwx
και να ορίσει το ESP στον χώρο του αρχείου εκτέλεσης. Ακολουθώντας τη ροή, το πρόγραμμα θα καλέσει ξανά την read στο ESP, αλλά σε αυτήν την περίπτωση το ESP θα δείχνει στην επόμενη εντολή, οπότε περνώντας ένα shellcode θα το γράψει ως την επόμενη εντολή και θα το εκτελέσει.Το SROP χρησιμοποιείται για να δώσει δικαιώματα εκτέλεσης (memprotect) στο σημείο όπου το shellcode τοποθετήθηκε.
Last updated