Integer Overflow
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
En el corazón de un desbordamiento de enteros está la limitación impuesta por el tamaño de los tipos de datos en la programación de computadoras y la interpretación de los datos.
Por ejemplo, un entero sin signo de 8 bits puede representar valores de 0 a 255. Si intentas almacenar el valor 256 en un entero sin signo de 8 bits, se envuelve a 0 debido a la limitación de su capacidad de almacenamiento. De manera similar, para un entero sin signo de 16 bits, que puede contener valores de 0 a 65,535, agregar 1 a 65,535 hará que el valor vuelva a 0.
Además, un entero con signo de 8 bits puede representar valores de -128 a 127. Esto se debe a que un bit se utiliza para representar el signo (positivo o negativo), dejando 7 bits para representar la magnitud. El número más negativo se representa como -128 (binario 10000000
), y el número más positivo es 127 (binario 01111111
).
Para las posibles vulnerabilidades web, es muy interesante conocer los valores máximos soportados:
El resultado impreso será 0 ya que desbordamos el char:
Considere una situación en la que un entero firmado se lee de la entrada del usuario y luego se utiliza en un contexto que lo trata como un entero no firmado, sin la validación adecuada:
En este ejemplo, si un usuario introduce un número negativo, se interpretará como un gran entero sin signo debido a la forma en que se interpretan los valores binarios, lo que puede llevar a un comportamiento inesperado.
Solo se utiliza 1B para almacenar el tamaño de la contraseña, por lo que es posible desbordarlo y hacer que piense que su longitud es 4 cuando en realidad es 260 para eludir la protección de verificación de longitud.
Dado un par de números, averigua usando z3 un nuevo número que multiplicado por el primero dará el segundo:
Solo se utiliza 1B para almacenar el tamaño de la contraseña, por lo que es posible desbordarlo y hacer que piense que su longitud es 4 cuando en realidad es 260 para eludir la protección de verificación de longitud y sobrescribir en la pila la siguiente variable local y eludir ambas protecciones.
Esto no cambia en ARM64 como puedes ver en esta publicación del blog.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)