2012-06-17 14 views
6

Estoy jugando con un ejemplo de desbordamiento de pila. Este ejemplo se ve así:Dillema con desbordamiento de búfer

void return_input (void){ 
    char array[30];  
    gets (array); 
    printf("%s\n", array); 

} 

main() { 
    return_input();  
    return 0;  
} 

Todo este código está en el archivo llamado overflow.c. Tenemos una función vulnerable llamada return_input, particularmente su matriz de 30 bytes. He compilado y abrí función vulnerable en GDB y obtuve siguiente resultado:

(gdb) disas return_input 
0x08048464 <+0>: push %ebp 
0x08048465 <+1>: mov %esp,%ebp 
0x08048467 <+3>: sub $0x48,%esp 
0x0804846a <+6>: mov %gs:0x14,%eax 
0x08048470 <+12>: mov %eax,-0xc(%ebp) 
0x08048473 <+15>: xor %eax,%eax 
0x08048475 <+17>: lea -0x2a(%ebp),%eax 
0x08048478 <+20>: mov %eax,(%esp) 
0x0804847b <+23>: call 0x8048360 <[email protected]> 
0x08048480 <+28>: lea -0x2a(%ebp),%eax 
0x08048483 <+31>: mov %eax,(%esp) 
0x08048486 <+34>: call 0x8048380 <[email protected]> 
0x0804848b <+39>: mov -0xc(%ebp),%eax 
0x0804848e <+42>: xor %gs:0x14,%eax 
0x08048495 <+49>: je  0x804849c <return_input+56> 
0x08048497 <+51>: call 0x8048370 <[email protected]> 
0x0804849c <+56>: leave 
0x0804849d <+57>: ret  
End of assembler dump. 

Como puede ver en el prólogo función reservamos hex48 (desc 72) bytes en la pila para las variables locales. Primero, estaba tratando de encontrar la dirección donde comienza nuestra matriz vulnerable en la pila. Creo que es -0x2a (% ebp), ¿estoy en lo cierto? Hex2a es 42 decimal. Según tengo entendido, significa que podemos escribir con seguridad 42 bytes antes de comenzar a sobrescribir el EBP guardado en la pila. Pero cuando corro este ejemplo es suficiente para la derecha sólo 37 bytes para conseguir fallo de segmentación:

[email protected]:~/temp/ELF_reader$ ./overflow 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
Segmentation fault (core dumped) 

¿Cómo es de 37 bytes suficientes el desbordamiento del buffer? Si nuestra matriz de caracteres local es de -42 bytes del archivo EBP

+0

No relacionado, pero [esta pregunta] (http://stackoverflow.com/questions/9249315/what-is-gs-in-assembly) es * extremadamente * similar. – huon

+0

En C, escribir 31 bytes en una matriz de 30 bytes es suficiente para desbordar esa matriz (y causar un comportamiento no definido). – pmg

Respuesta

6

guardado, es difícil saberlo sin ver el desmontaje completo de la función.

Sin embargo, supongo que el% gs: 0x14 almacenado en -0xc (% ebp) puede ser su stack canary que causa una salida limpia si se detecta una acumulación de pila. Por lo tanto, este valor se almacena a -0xc (% ebp), lo que significa que su búfer es de hecho solo 30 bytes de gran tamaño, seguido de lo que ocurra después.

+0

Gracias amigo, recompilado sin protección de pila gcc, y el código de ensamblado proporciona todos los valores correctamente. –

Cuestiones relacionadas