Δημοσιεύτηκε: 07 Σεπ 2011, 16:14
stamatiou έγραψε:
Επίσης για να κάνω μια γενική ερώτηση, το buffer overflow προκαλείται δλδ όταν δεν κάνουμε ελέγχους;
Το buffer overflow προκαλείται όταν το πρόγραμμά σου επιχειρεί να γεμίσει έναν πίνακα με περισσότερα στοιχεία από όσα τον έχεις ορίσει να δέχεται ως μέγιστο πλήθος. Οπότε όταν για παράδειγμα έχεις μια συνάρτηση insert_element( int array[], int element) που προσθέτει το στοιχείο element στον πίνακα array, πρέπει μέσα της να ελέγχεις ώστε αν ο πίνακας είναι ήδη γεμάτος να μην πάει να προσθέσει το element μετά το τέλος του πίνακα... γιατί αν το προσθέσει εκεί θα έχεις buffer overflow.
Το buffer overflow εγείρει segmentation-fault στο σύστημα (ίσως όχι αμέσως όμως, ίσως και ποτέ).
Λοιπόν φαντάσου πως έχεις ορίσει έναν πίνακα 3 πραγματικών και μια μεταβλητή ενός χαρακτήρα.
- Κώδικας: Επιλογή όλων
float array[3];
char c;
Φαντάσου τώρα ότι στο memory-layout του προγράμματος σου (όταν φορτωθεί δλδ στη μνήμη) αυτά τα δυο έχουν καταλάβει διαδοχικά κομμάτια μνήμης, π.χ...
- Κώδικας: Επιλογή όλων
θέσεις μνήμης:
... 20000001 20000001 20000002 20000003 ...
... array[0] array[1] array[2] c
Αν εσύ με οποιονδήποτε τρόπο, έμμεσο ή άμεσο, γράψεις κάτι σαν αυτό:
- Κώδικας: Επιλογή όλων
array[3] = 4.0;
τότε πας και βάζεις στη μνήμη 20000003 που έχει δεσμευτεί τη μεταβλητή c τον πραγματικό αριθμό 4.0 (και μάλιστα επειδή οι πραγματικοί αριθμοί πιάνουν περισσότερα του 1byte που πιάνουν οι χαρακτήρες, εκείνο το 4.0 θα πάει να κάνει overwrite και άλλα bytes μετά το c.
Οπότε όταν τα πρόγραμμά σου επιχειρήσει κατόπιν να χρησιμοποιήσει τη μεταβλητή c (ή οτιδήποτε έπεται κι έχει γίνει overwrite) στην καλύτερη των περιπτώσεων το c θα έχει τιμή ότι να'ναι και στη χειρότερη θα σου βαρέσει seg-fault. Αν τα έξτρα bytes είναι πολλά και πάνε να κάνουν overwrite μνήμη που το λειτουργικό την έχει μαρκάρει ως read-only, τότε το seg-fault θα προκληθεί άμεσα.
Seg-fault δεν εγείρεται μονάχα λόγω buffer-overflow, εγείρεται από διάφορους λόγους ένας εκ των οποίων μπορεί να είναι και το buffer-overflow. Άλλος λόγος που προκαλεί seg-fault είναι όταν προσπαθούμε να χρησιμοποιήσουμε τα περιεχόμενα ενός δείκτη που είναι NULL, ή να χρησιμοποιήσουμε undefined περιεχόμενα ενός δείκτη.
Το exploit κολλάει στο ότι π.χ. μια περίπτωση είναι χάκερς να ψάχνουν για παραγόμενα seg-faults ή να προκαλούν μόνοι τους seg-faults και να κάνουν overwrite με δικό τους τον κώδικα του λειτουργικού που είναι γραμμένος να τρέχει όταν υπάρξει seg-fault.