¿Es posible codificar bytes en una explotación de desbordamiento de búfer que desvía las funciones de cadena?

10

Descargo de responsabilidad : esta vulnerabilidad es únicamente para uso educativo. En este exploit, interpreto el papel de la víctima y el software explotado está escrito solo por mí.

Tengo un servidor HTTP simple que quiero explotar con un ataque de desbordamiento de búfer. Estoy enviando una solicitud HTTP maliciosamente diseñada que desborda el búfer de una variable de solicitud a través de la función strcpy, el escenario es que el desarrollador olvidó usar strncpy.

Sin embargo, hay dos desafíos con la sobrescritura de la dirección de retorno en este programa que no sé cómo resolver:

  1. Strcpy dejará de copiar cuando encuentre un byte NULO en la cadena de origen. Por lo tanto, ¿es posible sobrescribir la dirección de retorno con una dirección de destino que contiene el byte NULO 0x00? Por ejemplo, si la dirección de destino es 0x407200, debemos escribir \ x00 \ x72 \ x40. Sin embargo, strcpy devolverá el primer \ x00, y no copiará el \ x72 \ x40. Por lo tanto, ¿es posible codificar \ x00 de manera que no haga que strcpy regrese prematuramente?

  2. Del mismo modo, el analizador HTTP en mi servidor HTTP divide la solicitud HTTP en tokens con el carácter de espacio \ x20 como delimitador. Por lo tanto, ¿es posible escapar de este carácter, como el terminador NULL anterior, de modo que una dirección que contiene \ x20 no se divida en dos tokens separados por strtok?

Si no, ¿esto es solo una limitación de los ataques de desbordamiento del búfer, ya que, debido a la construcción del programa en cuestión, no siempre es posible sobrescribir la dirección de retorno con una dirección de destino de su elección?

    
pregunta George Robinson 25.07.2015 - 14:00
fuente

2 respuestas

4

Los bytes nulos en su dirección de retorno son difíciles de superar. Ya que es una dirección en lugar de un código, no se puede usar un código auxiliar de codificación. Sin embargo, hay algunas formas posibles de evitar esto:

1) Encuentra la dirección perfecta. A veces la aplicación copiará el código en la pila u otras áreas en la memoria. Si tiene suerte, puede encontrar una ubicación estática que contenga un código de operación adecuado, como jmp esp.

2) Verifique la compatibilidad con Unicode, Unicode de múltiples bytes le permitirá incluir bytes nulos en su carga útil.

3) Es posible rociar el montón y hacer que una dirección predeterminada contenga cada vez más su carga útil. Esta dirección predeterminada se puede elegir para que no contenga bytes nulos.

Buena suerte

    
respondido por el wireghoul 26.07.2015 - 03:02
fuente
3

Cuando estás explotando un desbordamiento de búfer, tu ataque es posible debido a una comprobación errónea subyacente en el código asm. En su caso, el uso de strcpy tiene fallas, por lo que tiene algunas limitaciones. De hecho, strcpy es una función de cadena.

Como dijiste, no puedes tener \ x00 byte. Puede encontrar otros casos (sin depender de stcpy) cuando \ x00 se puede permitir pero no en este caso. A veces, se realiza un "tratamiento" adicional antes de llamar a strcpy y tendrá bytes limitados como \ x20 en el protocolo HTTP.

Deberá trabajar en el exploit para sobrescribir la dirección de retorno y ejecutar su carga útil sin utilizar esos caracteres. Es posible que pueda tener éxito usando un Nop-slide antes de su carga útil; esto te permitirá cambiar tu dirección de shellcode.

También puede usar Regresar a lib C , u otro ROP .

    
respondido por el r00t 25.07.2015 - 17:31
fuente

Lea otras preguntas en las etiquetas