Integer Overflow
Βασικές Πληροφορίες
Στην καρδιά μιας υπερχείλισης ακεραίων βρίσκεται ο περιορισμός που επιβάλλεται από το μέγεθος των τύπων δεδομένων στην προγραμματισμό υπολογιστών και την ερμηνεία των δεδομένων.
Για παράδειγμα, ένας 8-μπιτος ακέραιος χωρίς πρόσημο μπορεί να αναπαριστά τιμές από 0 έως 255. Εάν προσπαθήσετε να αποθηκεύσετε την τιμή 256 σε έναν 8-μπιτο ακέραιο χωρίς πρόσημο, θα επιστρέψει στο 0 λόγω του περιορισμού της χωρητικότητάς του. Αντίστοιχα, για έναν 16-μπιτο ακέραιο χωρίς πρόσημο, ο οποίος μπορεί να κρατήσει τιμές από 0 έως 65.535, η προσθήκη 1 στο 65.535 θα επιστρέψει την τιμή πίσω στο 0.
Επιπλέον, ένας 8-μπιτος ακέραιος με πρόσημο μπορεί να αναπαριστά τιμές από -128 έως 127. Αυτό συμβαίνει επειδή ένα bit χρησιμοποιείται για την αναπαράσταση του προσήμου (θετικό ή αρνητικό), αφήνοντας 7 bits για την αναπαράσταση της μεγέθους. Ο πιο αρνητικός αριθμός αναπαρίσταται ως -128 (δυαδικό 10000000
), και ο πιο θετικός αριθμός είναι το 127 (δυαδικό 01111111
).
Μέγιστες τιμές
Για πιθανές ευπάθειες στον ιστό είναι πολύ ενδιαφέρον να γνωρίζουμε τις μέγιστες υποστηριζόμενες τιμές:
Η ανακάλυψη της υπερχείλισης ακεραιού είναι μια από τις πιο συνηθισμένες ευπάθειες που μπορεί να εκμεταλλευτεί ένας κακόβουλος χρήστης. Συμβαίνει όταν μια μεταβλητή ακεραίου υπερβαίνει το μέγιστο επιτρεπόμενο όριο της τιμής της, προκαλώντας την ανατίθεση της τιμής της μεταβλητής σε μια τιμή που δεν είναι αναμενόμενη από τον προγραμματιστή. Αυτό μπορεί να οδηγήσει σε ανεπιθύμητες συμπεριφορές, συμπεριλαμβανομένης της αποκάλυψης ευαίσθητων πληροφοριών ή ακόμη και στην εκτέλεση κώδικα που δεν επιτρέπεται. Είναι σημαντικό για τους προγραμματιστές να ελέγχουν τις τιμές των μεταβλητών ακεραίων για να αποτρέψουν την υπερχείλιση.
```c #include #include
int main() { int a = INT_MAX; int b = 0; int c = 0;
b = a * 100; c = a + 1;
printf("%d\n", INT_MAX); printf("%d\n", b); printf("%d\n", c); return 0; }
Μετατροπή από Υπογεγραμμένο σε Ανυπογεγραμμένο
Λάβετε υπόψη μια κατάσταση όπου ένα υπογεγραμμένο ακέραιο διαβάζεται από την είσοδο του χρήστη και στη συνέχεια χρησιμοποιείται σε ένα πλαίσιο που το αντιμετωπίζει ως ανυπογεγραμμένο ακέραιο, χωρίς κατάλληλο έλεγχο:
Σε αυτό το παράδειγμα, εάν ένας χρήστης εισάγει έναν αρνητικό αριθμό, θα ερμηνευτεί ως ένα μεγάλο μη υπογεγραμμένο ακέραιο λόγω του τρόπου με τον οποίο ερμηνεύονται οι δυαδικές τιμές, με πιθανή απροσδόκητη συμπεριφορά.
Άλλα Παραδείγματα
Το πρόγραμμα επικυρώνει μόνο το τελευταίο byte ενός αριθμού για να ελέγξει το μέγεθος της εισόδου, επομένως είναι δυνατόν να προστεθεί οποιοδήποτε μέγεθος όσο το τελευταίο byte βρίσκεται εντός του επιτρεπόμενου εύρους. Στη συνέχεια, η είσοδος δημιουργεί ένα buffer overflow που εκμεταλλεύεται με ένα ret2win.
Δεδομένων δύο αριθμών, βρείτε χρησιμοποιώντας το z3 ένα νέο αριθμό που πολλαπλασιασμένος με τον πρώτο θα δώσει τον δεύτερο:
\
Last updated