Integer Overflow

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Στην καρδιά μιας υπερχείλισης ακεραίων βρίσκεται ο περιορισμός που επιβάλλεται από το μέγεθος των τύπων δεδομένων στην προγραμματισμό υπολογιστών και την ερμηνεία των δεδομένων.

Για παράδειγμα, ένας 8-μπιτος ακέραιος χωρίς πρόσημο μπορεί να αναπαριστά τιμές από 0 έως 255. Εάν προσπαθήσετε να αποθηκεύσετε την τιμή 256 σε έναν 8-μπιτο ακέραιο χωρίς πρόσημο, θα επιστρέψει στο 0 λόγω του περιορισμού της χωρητικότητάς του. Αντίστοιχα, για έναν 16-μπιτο ακέραιο χωρίς πρόσημο, ο οποίος μπορεί να κρατήσει τιμές από 0 έως 65.535, η προσθήκη 1 στο 65.535 θα επιστρέψει την τιμή πίσω στο 0.

Επιπλέον, ένας 8-μπιτος ακέραιος με πρόσημο μπορεί να αναπαριστά τιμές από -128 έως 127. Αυτό συμβαίνει επειδή ένα bit χρησιμοποιείται για την αναπαράσταση του προσήμου (θετικό ή αρνητικό), αφήνοντας 7 bits για την αναπαράσταση της μεγέθους. Ο πιο αρνητικός αριθμός αναπαρίσταται ως -128 (δυαδικό 10000000), και ο πιο θετικός αριθμός είναι το 127 (δυαδικό 01111111).

Μέγιστες τιμές

Για πιθανές ευπάθειες στον ιστό είναι πολύ ενδιαφέρον να γνωρίζουμε τις μέγιστες υποστηριζόμενες τιμές:

fn main() {

let mut quantity = 2147483647;

let (mul_result, _) = i32::overflowing_mul(32767, quantity);
let (add_result, _) = i32::overflowing_add(1, quantity);

println!("{}", mul_result);
println!("{}", add_result);
}

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

```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; }

## Παραδείγματα

### Καθαρή υπερχείλιση

Το εκτυπωμένο αποτέλεσμα θα είναι 0 καθώς υπερχειλίσαμε το χαρακτήρα:
```c
#include <stdio.h>

int main() {
unsigned char max = 255; // 8-bit unsigned integer
unsigned char result = max + 1;
printf("Result: %d\n", result); // Expected to overflow
return 0;
}

Μετατροπή από Υπογεγραμμένο σε Ανυπογεγραμμένο

Λάβετε υπόψη μια κατάσταση όπου ένα υπογεγραμμένο ακέραιο διαβάζεται από την είσοδο του χρήστη και στη συνέχεια χρησιμοποιείται σε ένα πλαίσιο που το αντιμετωπίζει ως ανυπογεγραμμένο ακέραιο, χωρίς κατάλληλο έλεγχο:

#include <stdio.h>

int main() {
int userInput; // Signed integer
printf("Enter a number: ");
scanf("%d", &userInput);

// Treating the signed input as unsigned without validation
unsigned int processedInput = (unsigned int)userInput;

// A condition that might not work as intended if userInput is negative
if (processedInput > 1000) {
printf("Processed Input is large: %u\n", processedInput);
} else {
printf("Processed Input is within range: %u\n", processedInput);
}

return 0;
}

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

Άλλα Παραδείγματα

  • Το πρόγραμμα επικυρώνει μόνο το τελευταίο byte ενός αριθμού για να ελέγξει το μέγεθος της εισόδου, επομένως είναι δυνατόν να προστεθεί οποιοδήποτε μέγεθος όσο το τελευταίο byte βρίσκεται εντός του επιτρεπόμενου εύρους. Στη συνέχεια, η είσοδος δημιουργεί ένα buffer overflow που εκμεταλλεύεται με ένα ret2win.

  • Δεδομένων δύο αριθμών, βρείτε χρησιμοποιώντας το z3 ένα νέο αριθμό που πολλαπλασιασμένος με τον πρώτο θα δώσει τον δεύτερο:

(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)

\

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated