¿Es esta vulnerabilidad de desbordamiento de enteros explotable?

3

¿Se puede explotar este desbordamiento de enteros y, si la respuesta es sí, cómo puedo explotarlo?

char buffer[20];
int len = atoi(argv[1]);
if(len < 20)
  memcpy(buffer,argv[2],len);

Si configuro len en -1, la aplicación se bloquea, porque el número de bytes que se debe copiar es demasiado largo y hay un error de seguridad. Pero, ¿hay alguna manera o método para explotar la vulnerabilidad?

    
pregunta user126623 17.07.2016 - 23:41
fuente

3 respuestas

3

No necesita usar -1, cualquier valor mayor a 20 le permitirá desbordar el búfer.

Dependerá de las siguientes instrucciones y las mitigaciones establecidas por el compilador, pero a partir de este punto, probablemente pueda sobrescribir la dirección de retorno y ejecutar un código de shell como segundo parámetro.

    
respondido por el Ángel 17.07.2016 - 23:48
fuente
1

Es peligroso.

¿Es explotable? Posiblemente. Ya nos ha dicho que puede causar un bloqueo, por lo que puede hacer un DoS en un sistema al bloquearlo ... dependiendo de donde argv 1 proviene de. Si es un valor codificado, o si lo genera una aplicación que llama y solo puede estar entre 0 y 20, es posible que no sea explotable en el sistema. Seguiría siendo un mal patrón de codificación, ya que un pequeño cambio podría hacerlo explotable. O si nunca se ejecutó el código, o si es un código que solo es ejecutado por usted y nadie más lo ejecuta, las reglas del firewall impiden valores por debajo de 0 o por encima de 20, etc., entonces no sería explotable.

¿Es ejecutable? Tal vez. No tenemos suficiente información para determinar de cualquier manera. No sabemos si el compilador inserta pila de canarios. No sabemos si hay otro código que controle argv 1 y obliga a que sea un valor seguro.

Intente usar ! exploitable si está ejecutando en Windows si desea una pista (no recuerdo las herramientas para otros sistemas operativos).

    
respondido por el atk 18.07.2016 - 00:10
fuente
0

Nadie parece pensar en la posibilidad de que argv [1] no sea un número. Si solo ingresa "esto" como primer argumento, atoi devuelve 0, y también puede desbordar el búfer porque 0 < 20. atoi no es una buena opción en muchos aspectos. Es mejor usar strtol, que te permite detectar errores de entrada.

    
respondido por el kaidentity 17.08.2016 - 15:58
fuente

Lea otras preguntas en las etiquetas