2009-11-15 17 views
8

Estoy un poco confundido con la idea de la inyección de código en C. Si alguien pudiera explicarlo y mostrar cómo se hace, lo agradecería.Comprender y hacer Inyección de código en C

Digamos que en C tiene una matriz Char de tamaño 512 que está siendo escrita en el contenido de un conector de longitud 1024, y que la matriz char contiene algún tipo de código pero solo la mitad de lo que se escribió.

Cómo se ejecuta el código malicioso en un desbordamiento de búfer, creo que estoy confundido en la estructura del proceso (pila, pila, datos, texto).

+3

Puede aceptar respuestas a algunas de sus preguntas anteriores haciendo clic en la casilla de verificación junto a la respuesta correcta. –

+0

Gracias a los chicos que ni siquiera sabía acerca de esa característica. – Recursion

Respuesta

8

El truco general tiene que ver con cómo el código del programa y las variables se presentan en la memoria. Por ejemplo, cuando se llama a una función, el programa (código insertado por el compilador) debe almacenar la dirección de la instrucción a la que volverá. Así que si esta es la palabra de 32 bits justo antes del comienzo de la pila, se podría hacer:

void foo() 
{ 
    int array[5]; 
    int var = 0; 
    int var2 = 0; 

    // read in user input 
    printf("Enter index and value to write:"); 
    scanf("%i", var); 
    scanf("%i", var2); 

    // malicious user might set var to -1 and var2 to an address to execute 
    // if say the 32-bit value before the stack variables is the instruction to 
    // return to 
    array[var] = var2 

    // return now goes to malicious code 
} 

(. Así que su trabajo es la construcción de código para que tal cosa no es posible :))

Las reglas para la implementación de una llamada a una función, las variables de pila asignadas, los valores pasados ​​y los valores devueltos devueltos se llaman calling convention. Recomiendo leer el artículo adjunto para obtener una buena cobertura en profundidad de las convenciones de llamadas de C.

0

Una pila típica para cada subrutina podría tener este aspecto:

  • parámetros (valores que se transmiten como parámetros a esta subrutina)
  • dirección de retorno (dirección de código desde el que se llama esta rutina)
  • valores de los registros guardados
  • variables locales

Si una subrutina tiene un local de variabl e, y de alguna forma, escribe más allá del final de la variable local y luego sobrescribe los valores (en la pila) como la dirección de retorno, es decir, la dirección del código que se ejecutará al final de la subrutina cuando la subrutina "devuelve" ".

2

Si asigna un búfer en la pila, y se desborda, escribe en la pila. La pila contiene el puntero de retorno para la función que asignó el búfer. Por lo tanto, si desborda un búfer en la pila, puede establecer el puntero de retorno a algo arbitrario; por lo tanto, le da control del hilo de ejecución.

En cuanto a realmente inyectar el código, eso depende. La pila, o mejor dicho, la página que la contiene, a menudo está configurada para no permitir la ejecución del código; pero históricamente habría sido posible almacenar pequeños programas maliciosos en el propio buffer en la pila. Return oriented programming es una variante bastante nueva del ataque return-to-libc, que funcionan alrededor de NX bits.

Cuestiones relacionadas