Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες



Σχετικά έγγραφα
Παράλληλη Επεξεργασία

Λειτουργικά Συστήματα (ΗΥ321)

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Δομημένος Προγραμματισμός

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Λειτουργικά Συστήματα (Λ/Σ)

Υποστήριξη διαδικασιών στο υλικό των υπολογιστών

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Κατανεμημένα Συστήματα

6. Επιστροφή ελέγχου στο σημείο εκκίνησης

MIPS functions and procedures

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 6 C & Assembly

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Ε-85: Ειδικά Θέµατα Λογισµικού

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στον Προγραμματισμό

C: Από τη Θεωρία στην Εφαρμογή

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Δομημένος Προγραμματισμός (ΤΛ1006)

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Χειμερινό Εξάμηνο

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Λειτουργικά Συστήματα (ΗΥ-345) Χειμερινό Εξάμηνο

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Συναρτήσεις-Διαδικασίες

Εικονική Μνήμη (1/2)

Διαδικασίες Ι. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 4

Χρονοδρομολογητής Κυκλικής Επαναφοράς

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes)

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Λειτουργικά Συστήματα

Διαδικασιακός Προγραμματισμός

Μεθόδων Επίλυσης Προβλημάτων

HY-486 Αρχές Κατανεμημένου Υπολογισμού

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Χειμερινό Εξάμηνο M. Χατζόπουλος. Προθεσμία: 19/01/2015

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Εργαστήριο 5. Εαρινό Εξάμηνο

Εισαγωγή στην Πληροφορική

Αρχιτεκτονική Υπολογιστών Ι

Νήµατα. Πολύ σηµαντικό

Εισαγωγικά & Βασικές Έννοιες

Προγραμματισμός Υπολογιστών με C++

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

Γενική οργάνωση υπολογιστή «ΑΒΑΚΑ»

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Ιδιοκτησία Αντικειµένου

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

Unix: Εντολές, οργάνωση και χειρισµός αρχείων, διεργασίες

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

2η Προγραµµατιστική Εργασία

Διεργασίες και Νήματα (2/2)

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Διάλεξη Εισαγωγή στη Java, Μέρος Γ

Δομημένος Προγραμματισμός (ΤΛ1006)

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Ασκήσεις - Μελέτες περίπτωσης για το μάθημα Προγραμματισμός II

Προγραμματισμός συστημάτων UNIX/POSIX

Εργαστήριο 4. Εαρινό Εξάμηνο ΠΡΟΣΟΧΗ: Αρχίστε νωρίς το Εργαστήριο 4. Οι ασκήσεις είναι πιο απαιτητικές από τα προηγούμενα εργαστήρια.

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Τμήμα Λογιστικής. Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. Μάθημα 8. 1 Στέργιος Παλαμάς

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

Διάλεξη 5: Δείκτες και Συναρτήσεις

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Transcript:

0x375 - Thessaloniki Tech Talks Sessions Event 0x2 19 Μαρτίου 2010

Περιεχόμενα 1 Εισαγωγή 2 Η κλήση συστήματος ptrace 3 Νήματα 4 Το πρόγραμμα εισαγωγής κώδικα prez 5 Επίλογος

Γιατί; Πολλές φορές θέλουμε να εκτελέσουμε κώδικα ο οποίος θα μοιράζεται resources με κάποιο process (vm, file descriptors) Ο κώδικας αυτός μπορεί να τρέχει σε ένα ξεχωριστό thread κάντοντας το πιο δύσκολο στον εντοπισμό (ειδικό flag στην εντολή ps, δεν υπάρχει ξεχωριστό directory στο /proc αλλά βρίσκεται κάτω από το /proc/<pid>/task)

Πώς; Θα πρέπει να βρούμε έναν τρόπο να εκτελέσουμε δικό μας κώδικα μέσα στα πλαίσια του προγράμματος ο κώδικας αυτός πρέπει να φροντίσει για την συνέχιση της εκτέλεσης του νέου κώδικα που θα τρέχει παράλληλα, δεσμεύοντας την κατάλληλη μνήμη και δημιουργόντας το thread Τα παραπάνω θα γίνουν με τις κλήσεις συστήματος ptrace και clone

Σύνοψη Δήλωση #include <sys / ptrace. h> long ptrace (enum ptrace_request request, p i d _ t pid, void * addr, void * data ) ; Παράμετροι request: Η ενέργεια που θα πραγματοποιήσουμε pid: Το process id της διεργασίας addr: Εξαρτάται από την ενέργεια data: Εξαρτάται από την ενέργεια

Δυνατότητες της ptrace PTRACE_PEEKME/PTRACE_ATTACH: Έναρξη ελέγχου διεργασίας PTRACE_DETACH: Τερματισμός ελέγχου διεργασίας PTRACE_PEEKTEXT/PTRACE_PEEKDATA: Ανάγνωση μίας λέξης από το address space της διεργασίας PTRACE_POKETEXT/PTRACE_POKEDATA: Εγγραφή μίας λέξης στο address space της διεργασίας PTRACE_GETREGS: Ανάγνωση των καταχωρητών γενικής χρήσης της διεργασίας PTRACE_SETREGS: Εγγραφή στος καταχωρητές γενικής χρήσης της διεργασίας

Έναρξη ελέγχου διαδικασίας Πηγαίος κώδικας ptrace ( PTRACE_ATTACH, proc, NULL, NULL ) ; wait ( NULL ) ; Ροή προγράμματος Εκτελείται η ptrace από το process που θέλει να προσκοληθεί σε κάποιο άλλο Το δεύτερο process γίνεται παιδί του πρώτου και λαμβάνει το σήμα SIGSTOP Ο πατέρας περιμένει μέχρι να λάβει ειδοποίηση ότι το παιδί έλαβε το σήμα το οποίο σημαίνει ότι πλέον έχει σταματήσει πλήρως

Ανάγνωση/εγγραφή δεδομένων διαδικασίας Πηγαίος κώδικας data = ptrace ( PTRACE_PEEKDATA, proc, addr, NULL ) ; data++; ptrace ( PTRACE_POKEDATA, proc, addr, data ) ; Ροή προγράμματος Ο πατέρας με την πρώτη κλήση της ptrace διαβάζει ένα word από την διεύθυνση addr του παιδιού και το επιστρέφει Αυξάνει την τιμή του και με την δεύτερη κλήση της ptrace γράφει την τιμή αυτή πάλι στην διεύθυνση addr

Ανάγνωση/εγγραφή καταχωρητών διαδικασίας Πηγαίος κώδικας struct u s e r _ r e g s _ s t r u c t regs ; ptrace ( PTRACE_GETREGS, proc, NULL, &regs ) ; regs. eax = 0xdeadbeef ; ptrace ( PTRACE_SETREGS, proc, NULL, &regs ) ; Ροή προγράμματος Ο πατέρας με την πρώτη κλήση της ptrace διαβάζει όλους τους καταχωρητές γενικής χρήσης του παιδιού στην δομή regs Θέτει στον eax την τιμή 0xdeadbeef και με την δεύτερη κλήση της ptrace θέτει τις τιμές που είναι αποθηκευμένες στην δομή regs στους καταχωρητές του παιδιού

Εισαγωγή κώδικα σε μία διεργασία void readmem( p i d _ t proc, unsigned long addr, char * buffer, int length ) ; void writemem ( p i d _ t proc, unsigned long addr, char * buffer, int length ) ; ptrace ( PTRACE_GETREGS, proc, NULL, &regs ) ; readmem( proc, regs. eip, oldcode, len ) ; writemem ( proc, regs. eip, injcode, len ) ; ptrace ( PTRACE_CONT, proc, NULL, NULL ) ; waitpid ( proc, NULL, 0 ) ; writemem ( proc, regs. eip, oldcode, len ) ; ptrace ( PTRACE_SETREGS, proc, NULL, &regs ) ; ptrace ( PTRACE_CONT, proc, NULL, NULL ) ;

Εισαγωγή κώδικα σε μία διεργασία Αρχικά αποθηκεύουμε τις τιμές των καταχωρητών στην δομή regs Αποθηκεύουμε τον παλιό κώδικα στην θέση eip στην μεταβλητή oldcode Στην θέση του τοποθετούμε τον κώδικα που θέλουμε να εισάγουμε Συνεχίζουμε την διεργασία και εκτελείται ο κώδικας μας Πρέπει η εκτέλεση να σταματήσει ώστε να αναλάβει ο πατέρας και για τον λόγο αυτό στο τέλος του κώδικα μας εισάγουμε την εντολή int 3 Ο πατέρας επαναφέρει τον αρχικό κώδικα και τις αρχικές τιμές των καταχωρητών Η εκτέλεση συνεχίζεται εκτελόντας τον αρχικό κώδικα της διεργασίας

Εισαγωγικά Κάθε διεργασία έχει τουλάχιστον ένα νήμα Κάθε νήμα αποτελεί μία διαφορετική ροή εκτέλεσης που μπορεί να εκτελείται ταυτόχρονα με κάποια άλλη Η δημιουργία γίνεται με την χρήση της κλήσης συστήματος clone Το νέο νήμα μπορεί να μοιράζεται την ίδια μνήμη με το νήμα που το δημιούργησε, τα ίδια ανοιχτά αρχεία, το ίδιο αναγνωριστικό (pid) κτλ Κάθε νήμα έχει την δική του στοίβα

Σύνοψη της clone Δήλωση #include <sched. h> int clone ( int ( * fn ) ( void * ), void * c h i l d _ s t a c k, int flags, void * arg,... ) ; Παράμετροι fn: η συνάρτηση που θα εκτελέσει το νέο νήμα child_stack: η στοίβα του νέου νήματος flags: ρυθμίσεις για το νέο νήμα arg: όρισμα που θα περάσει στην συνάρτηση fn λοιπές παράμετροι: εξαρτώνται από τις ρυθμίσεις

Κλήση της clone από assembly Σε αντίθεση με τις υπόλοιπες κλήσεις συστήματος ο wrapper δεν μεταφέρει απλά τα ορίσματα στους καταχωρητές Πρέπει πρώτα να βρεθεί χώρος για την στοίβα και να ετοιμαστεί κατάλληλα Οι λοιπές παράμετροι δίνονται πάντα αλλά χρησιμοποιούνται μόνο στην περίπτωση που υπάρχουν ειδικές ρυθμίσεις στην μεταβλητή flags Μετά την κλήση συστήματος (με χρήση της int 0x80 ή sysenter) πρέπει να γίνει έλεγχος για την τιμή που επιστρέφεται στον καταχωρητή eax και εαν είναι μηδενική πρέπει ο κώδικας να καλέσει την συνάρτηση fn Επειδή η συνάρτηση μπορεί να επιστρέψει θα πρέπει να χρησιμοποιηθεί η κλήση συστήματος exit για να σταματήση το νήμα την εκτέλεσή του

Απαιτήσεις για ένα νέο νήμα Θα χρειαστεί ειδικός χώρος όπου θα υπάρχει ο κώδικας που θα εκτελεστεί και χώρος για την νέα στοίβα Για να μην γίνει overwrite χρήσιμη μνήμη μπορεί να χρησιμοποιηθεί η κλήση συστήματος brk η οποία θα μας επιστρέψει νέα μνήμη Η μνήμη η οποία θα επιστραφεί κατά κανόνα δεν βρίσκεται σε μέρος όπου επιτρέπεται η εκτέλεση κώδικα, μόνο η ανάγνωση και εγγραφή Μπορούμε να δημιουργήσουμε ένα νέο ανώνυμο mapping όπου θα έχουμε όλα τα απαραίτητα δικαιώματα (rwx) και να βάλουμε στην αρχή τον κώδικα που θα εκτελεστεί και στο τέλος θα αρχίζει η στοίβα

Το πρόγραμμα εισαγωγής κώδικα prez Το prez αποτελείται από τρία μέρη τον injector τον thread creator τον shellcode

Ο injector Το κυρίως πρόγραμμα, γραμμένο σε C. Τα βήματα που εκτελεί είναι: Attach στο process Αποθήκευση του παλιού κώδικα στο σημείο που δείχνει ο eip και των registers Εγγραφή του thread creator και του shellcode Συνέχιση της εκτέλεσης του process και εκτέλεση του κώδικα που αντιγράψαμε πιο νωρίς Ο thread creator μετά την ολοκλήρωση του εκτελεί την εντολή int3 και επιστρέφει πίσω στον injector Ο injector επαναφέρει τον παλιό κώδικα και τις παλιές τιμές των registers και κάνει detach από το process

Ο thread creator Το μέρος του προγράμματος που αναλαμβάνει το mapping της νέας μνήμης και την δημιουργία του thread. Πλήρως γραμμένο σε assembly. Τα βήματα που εκτελεί είναι: Εκτέλεση της mmap για να λάβει ένα νέο μέρος μνήμης με δικαιώματα ανάγνωσης, εγγραφής και εκτέλεσης. Αντιγραφή του shellcode στην αρχή του νέου μέρους μνήμης που επιστράφηκε Δημιουργία κατάλληλης δομής στο τέλος της μνήμης αυτής που θα χρησιμοποιηθεί ως στοίβα του νέου thread Δημιουργία ενός νέου thread με την χρήση της clone Εκτέλεση της εντολής int3 για επιστροφή στον injector στον πατέρα ή κλήση του κώδικα που αντιγράφηκε στην νέα μνήμη το παιδί

Ο shellcode Ο κώδικας αυτός μπορεί να εκτελεί όποιες λειτουργίες θέλουμε. Τα χαρακτηριστικά του είναι ότι πρέπει να είναι position independent. Μέσα στο prez υπάρχει ως παράδειγμα ένα τμήμα κώδικα το οποίο δέχεται συνδέσεις σε μία συγκεκριμένη TCP πόρτα και εκτελεί ένα shell για κάθε νέα σύνδεση.

save state...... Σχηματικά INJECTOR PROCESS TRACED PROCESS ORIGINAL ADDRESS SPACE MODIFIED ADDRESS SPACE ptrace STOP save ovwr. code EIP overwrite w/ injection injection code ptrace RUN overwritable code shell code

Σχηματικά TRACED PROCESS MODIFIED ADDRESS SPACE NEW THREAD ADDRESS SPACE RUN new mmap new mmap relocate spawn relocate spawn shell code thr decouple thr decouple shell code shell code shared address space

ptrace run...... Σχηματικά INJECTOR PROCESS TRACED PROCESS MODIFIED ADDRESS SPACE RUN STOP new mmap restore ovwr. code relocate shell code spawn restore proc state RUN int 3 jmp $shellcode

Ιδέες για το μέλλον Μεταφορά σε άλλα λειτουργικά συστήματα (ήδη υπάρχει έκδοση για freebsd) Shellcode με περισσότερες δυνατότητες (εύρεση passwords αποθηκευμένων στην μνήμη, καταγραφή δεδομένων εισόδου - εξόδου) Shellcode ο οποίος πλέον θα κάνει ptrace το αρχικό process και θα μπορεί να το χειρίζεται πλήρως (ήδη έχουν γίνει κάποια βήματα προς αυτή την κατεύθυνση)

Ερωτήσεις Ευχαριστώ για την προσοχή σας! Ερωτήσεις;