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
No relacionado, pero [esta pregunta] (http://stackoverflow.com/questions/9249315/what-is-gs-in-assembly) es * extremadamente * similar. – huon
En C, escribir 31 bytes en una matriz de 30 bytes es suficiente para desbordar esa matriz (y causar un comportamiento no definido). – pmg