Che cosa è un integer overflow?
Questa FAQ risposta è stata scritta da k4thryn:
Un integer overflow, intero o confezionamento, è un potenziale problema in un programma basato sul fatto che il valore che può essere tenuto in un dato numerico è limitata dal tipo di dati della dimensione in byte. ANSI C utilizza le seguenti dimensioni minime:
| tipo di dati | Dimensione (bytes) |
|---|---|
| char | 1 |
| breve | 2 |
| int | 2 |
| lungo | 4 |
In pratica, molti compilatori usare un 4-byte int. E 'anche opportuno ricordare che l'attuale gamma di tipi di dati dipende dal fatto che siano firmati. per esempio, uno firmato 2 byte breve può essere tra -32.767 e 32.767, mentre un unsigned short può essere compreso fra 0 e 65535. Consultare il [include] / limits.h file per numeri specifici per il vostro compilatore.
Perché si deve la cura? Se si tenta di mettere un valore in un tipo di dati che è troppo piccola per tenerlo, per l'elevato bit-sono scesi, e solo il basso per bit vengono memorizzati. Un altro modo di dire è che-aritmetica modulo viene eseguito sul valore prima di conservarla per assicurarsi che si inserisce all'interno del dato. Assunzione unsigned nostra breve esempio:
| Limite: | 65535 o 1111 1111 1111 1111 |
| Troppo grande: | 65536 o 1 0000 0000 0000 0000 |
| Che cosa c'è di memorizzato: | 0 o 0000 0000 0000 0000 |
Per quanto sopra rende evidente, tale risultato è dovuto al fatto che l'alto-fine (o più a sinistra) il valore di bit che è troppo grande è stato eliminato. Oppure si potrebbe dire che ciò che è memorizzato è il risultato di
= valore memorizzato% (limite + 1) o 65536% (65535 + 1) = 0
In firmato di dati, il risultato è un po 'diverse e in alcuni risultati apparentemente strano comportamento:
| Positivo limite: | 32767 o 0111 1111 1111 1111 |
| Troppo grande: | 32768 o 1000 0000 0000 0000 |
| Che cosa c'è di memorizzato: | -32768 |
Perché quello? E 'a causa della "2 del complimento", che è come i numeri negativi sono rappresentati in binario. Per farla breve, la prima metà del range (da 0 a 0111 1111 1111 1111) è usato per numeri positivi, in ordine di meno al massimo. la seconda metà della gamma viene poi usato per i numeri negativi in ordine di meno al massimo. in modo negativo la gamma firmato per un 2-byte breve è -32768 attraverso -1, in questo ordine.
Stai ancora chiedendo il motivo per cui questa materia, non sono voi? Supponiamo che la memoria viene assegnato sulla base di un tipo di dati non firmati intero valore. Se tale valore è intorno, che può essere troppo poco memoria saranno messi a disposizione. Oppure, se il confronto viene fatto tra un valore intero e firmato qualche altro numero, partendo dal presupposto che il primo deve essere inferiore a quest'ultimo, se tale valore ha sorvolato in senso negativo, il confronto potrebbe passare. Ma sono cose che il modo di comportarsi il programmatore destinato? Probabilmente no.
Ulteriori fonti di informazione sulla integer overflow
Mentre è al di là del campo di applicazione del presente articolo, ci sono altre risorse che vanno più in dettaglio di integer overflow bug, la loro prevenzione, e il loro sfruttamento. Cioè, ci sono due articoli molto interessanti in Phrack # 60 (uno da Oded Horovitz, e uno da blexim) sulla vulnerabilità di integer overflow. Integer confezione è anche oggetto del "codice sorgente professionale di revisione" la presentazione da 2002 Black Hat Briefings USA (Dowd, et als).
Uno strumento per Esperimento con integer overflow
Il programma int_wrap.c ti permette di giocare con questo comportamento specificando sulla riga di comando, se il tipo di dati (a breve) dovrebbe essere firmato o non firmati, e che il valore che si desidera utilizzare.
Nota: Perl sembra avere un limite di 250 caratteri sui numeri, e muore con l'errore "Numero troppo lungo" (versione 5.8.0 di sperimentazione). Tuttavia, il numero di cifre significative è molto inferiore a quello.
|






