stack overflow overflow en la función principal? [cerrado]

7

Estoy intentando explotar una vulnerabilidad de desbordamiento basada en la pila. Sin embargo, todos los ejemplos que puedo encontrar hacen uso de una dirección ret . El desbordamiento de búfer que encontré está dentro de la función principal y no puedo encontrar ningún ejemplo sobre cómo hacer esto.

El código se ve así:

int main(){
   while (1){
   //some code
      switch() {
         case 0:
         char id[128];
         sscanf(buffer,"%s", id);
         break;
      }
   }
}

El contenido del búfer está controlado por el usuario.

    
pregunta Noah Goldsmid 21.04.2015 - 14:07
fuente

1 respuesta

14

Te has encontrado con la parte más difícil de explotar un desbordamiento de búfer: determinar cómo hacer que se ejecute el código. Inyectar el código es trivial una vez que haya encontrado la vulnerabilidad, pero lograr que la CPU comience a ejecutar ese código, no tanto.

Sin una comprensión sólida de diseño del marco de pila , encontrará el resto difícil de seguir.

Un punto a tener en cuenta es que en C, main , desde el punto de vista del proceso, es solo otra función que se llama (esto es diferente en C ++, vea el comentario a continuación). Mientras piensa que es el comienzo de la ejecución, para la CPU es una llamada de función completa con una dirección de retorno en la pila. Por lo tanto, explotar una falla en main es lo mismo que explotar una falla en cualquier otra función.

Como atacante, todo lo que puede hacer con un desbordamiento de búfer es escribir en la sección de datos del proceso, debe encontrar una manera de que el proceso lea algo de los datos que controlan lo que se ejecutará. Básicamente, necesita un lugar en la memoria de datos donde se verá el proceso para determinar qué se debe ejecutar a continuación (es decir, para determinar el valor del contador del programa o PC).

El tipo más común de ubicaciones en la memoria de datos que afecta a la PC es el puntero de retorno de una función. Al regresar de una función, la CPU leerá el puntero de retorno fuera de la pila y configurará la PC (o la instrucción después de ella, detalles de la CPU). A menos que regrese de la función main , es muy poco probable que ejecute un ataque exitoso. Necesitará un lugar en los datos, preferiblemente en el montón, donde el procesador leerá los datos que se utilizan para configurar la PC.

Los otros lugares "comunes" (aunque mucho menos comunes) en la memoria de datos que se utilizan para explotar un ataque de desbordamiento de búfer son punteros a función seguidos de una llamada a función, y tablas de excepciones seguidas de una excepción. Ninguno de estos parece ser aplicable a su aplicación. Por lo tanto, es probable que tenga una vulnerabilidad de desbordamiento de búfer de pila no explotable. Lo peor que sospecho que puedes hacer es bloquear tu aplicación.

Los pasos que debe tomar el atacante para una explotación de desbordamiento de búfer de pila estándar son:

  1. Identificar la vulnerabilidad de desbordamiento del búfer de la pila.
  2. Determine la dirección de la pila en el momento de la vulnerabilidad.
  3. Determine la dirección del puntero de retorno de función en el marco de pila actual.
  4. Escriba el código (con frecuencia denominado shellcode ) para el ataque.
  5. Cree una entrada que cargue el código y modifique el puntero de retorno de función para que apunte al código de shell en la pila.

Así que ahora que ha encontrado la vulnerabilidad, debe determinar la dirección de la pila para la llamada a main . La forma más sencilla de hacerlo es imprimir la dirección de id . A continuación, la ubicación del puntero de retorno. Es probable que sea dos palabras más bajas en la memoria que id . Algo como (char *)id-2*sizeof(int) .

El siguiente paso es escribir tu shellcode. Le sugiero que cree una función en su programa que imprima la cadena "ataque exitoso" y luego salga. Haz de tu shellcode una llamada a esta función.

Ahora siéntese y distribuya los datos en la pila (esta disposición del marco de la pila debería ayudar) incluyendo una Dirección de retorno saltando al búfer de la variable id . Convierta los datos de la pila a ASCII e ingréselos en el programa.

Esta página tiene un ejemplo más concreto de lo que he descrito.

    
respondido por el Neil Smithline 21.04.2015 - 17:47
fuente

Lea otras preguntas en las etiquetas