¿Qué es un desbordamiento?
Este FAQ respuesta fue escrito por k4thryn:
Un desbordamiento de entero, entero o embalaje, es un problema potencial en un programa basado en el hecho de que el valor que puede ser celebrada en un dato numérico está limitada por el tipo de datos de tamaño en bytes. ANSI C utiliza los calibres mínimos siguientes:
| tipo de datos | tamaño (en bytes) |
|---|---|
| char | 1 |
| corto | 2 |
| int | 2 |
| largo | 4 |
En la práctica, muchos compiladores utilizar un 4-byte int. También debe señalarse que la actual va para los tipos de datos dependerá de si están o no firmados. por ejemplo, la firma de un 2-byte corto puede estar entre -32767 y 32767, mientras que un corto sin firmar puede situarse entre 0 y 65535. Consulte a su [incluyen] / limits.h archivo para el número concreto de su compilador.
¿Por qué debería usted cuida? Si intenta poner un valor en un tipo de datos que es demasiado pequeño como para sostenerlo, los bits de alto orden se ha caído, y sólo bajo la orden de los bits se almacenan. Otra forma de decir que es el módulo de cálculo-se realiza sobre el valor antes de guardarla para asegurarse de que encaja en el dato. Teniendo corto sin firmar nuestro ejemplo:
| Límite: | 65535 o 1111 1111 1111 1111 |
| Demasiado grande: | 65536 o 1 0000 0000 0000 0000 |
| ¿Qué está almacenado: | 0 o 0000 0000 0000 0000 |
Como lo anterior pone en evidencia, ese resultado se debe a que la orden de alto (o la izquierda-la mayoría de) el valor de algo que es demasiado grande se ha caído. O usted podría decir que lo que está almacenado es el resultado de
= valor almacenado% (límite + 1) o 65536% (65535 + 1) = 0
En firmado de datos, el resultado es un poco diferente y los resultados en algunos aparentemente extraño comportamiento:
| Límite positivo: | 32767 o 0111 1111 1111 1111 |
| Demasiado grande: | 32768 o 1000 0000 0000 0000 |
| ¿Qué está almacenado: | -32768 |
¿Por qué es eso? Es a causa de "2 de complementar", que es como los números negativos están representados en binario. Para abreviar una larga historia, la primera mitad de la gama (de 0 a 0111 1111 1111 1111) se utiliza para un número positivo en orden de menos a más. la segunda mitad de la gama se utilizará para los números negativos en el orden de menos a más. por lo que la negativa de la firma de un rango de 2-byte es de -32768 corto a través de -1, en ese orden.
Usted está preguntando por qué todavía esta materia, ¿no? Supongamos que la memoria está asignado sobre la base de un tipo de datos entero sin signo de valor. Si el valor que ha envuelto alrededor, puede que demasiado poco de memoria se pondrá a disposición. O si la comparación se hace entre la firma de un valor y algún otro número, en el supuesto de que el primero debe ser inferior a este último, si el valor que ha sobrevolado en el negativo, la comparación pasaría. Pero son cosas que van a comportarse de la forma en que el programador de la intención? Probablemente no.
Fuentes de información adicional sobre desbordamientos
Si bien es más allá del alcance de este artículo, hay otros recursos que entrar en más detalles acerca de desbordamiento de errores, su prevención, y su explotación. Es decir, hay dos muy interesantes artículos en Phrack # 60 (uno por Oded Horovitz, y uno por blexim) sobre vulnerabilidades de desbordamiento. Envasado entero también está incluida en el "profesional de auditoría de código fuente" de la presentación Negro Hat EE.UU. 2002 Reuniones informativas (Dowd, et als).
Una herramienta para experimentar con desbordamientos
El programa int_wrap.c le permite jugar con este comportamiento especificando en la línea de comandos si el tipo de datos (corto) debe ser firmado o sin firmar, y que el valor que desea utilizar.
Nota: Perl parece tener un límite de 250 dígitos en números, y muere con el error "Número demasiado largo" (versión de prueba 5.8.0). Sin embargo, el número de dígitos significativos es mucho menos que eso.
|






