Estás en:   ArielOrtiz.com > Programación avanzada > Buffer overflow

Buffer overflow

Esta actividad no es para entregar.

Problema

Se tiene el siguiente programa en lenguaje C para un sistema x86-64:

01: #include <stdio.h>
02:
03: void super_punch(void) {
04:    static int c = 0;
05:    long s[2] = { 0xdeadbeaf, 0xcafebabe };    
06:    s[3] += (c < 3 ? -15: 10); 
07:    c++;
08: }
09:
10: int main(void) {
11:    puts("She loves you,");
12:    puts("yeah,");
13:    super_punch();    
14:    puts("And you know you should be glad.");
15:    return 0;
16: }

NOTA: Probablemente este programa funcione de manera errática y/o incorrecta en algunos sistemas.

En gdb, después de colocar un breakpoint en la línea 6 y correrlo, podemos inspeccionar el estado actual del programa justo cuando se detiene en dicho breakpoint:

(gdb) p $rbp
$1 = (void *) 0x7fffffffe030
(gdb) p &s[0]
$2 = (long int *) 0x7fffffffe020
(gdb) x/2xg $rbp
0x7fffffffe030:	0x00007fffffffe040	0x0000000000400567
(gdb) x/4xg &s[0]
0x7fffffffe020:	0x00000000deadbeaf	0x00000000cafebabe
0x7fffffffe030:	0x00007fffffffe040	0x0000000000400567
(gdb) disassemble /m main
Dump of assembler code for function main:
10	int main(void) {
   0x000000000040054a <+0>:	push   %rbp
   0x000000000040054b <+1>:	mov    %rsp,%rbp

11	   puts("She loves you,");
   0x000000000040054e <+4>:	mov    $0x400670,%edi
   0x0000000000400553 <+9>:	callq  0x4003f0 <puts@plt>

12	   puts("yeah,");
   0x0000000000400558 <+14>:	mov    $0x40067f,%edi
   0x000000000040055d <+19>:	callq  0x4003f0 <puts@plt>

13	   super_punch();    
   0x0000000000400562 <+24>:	callq  0x4004f4 <super_punch>

14	   puts("And you know you should be glad.");
   0x0000000000400567 <+29>:	mov    $0x400688,%edi
   0x000000000040056c <+34>:	callq  0x4003f0 <puts@plt>

15	   return 0;
   0x0000000000400571 <+39>:	mov    $0x0,%eax

16	}
   0x0000000000400576 <+44>:	leaveq 
   0x0000000000400577 <+45>:	retq   

End of assembler dump.

A partir de la información anterior, indica qué imprime el programa (corriéndolo fuera de gdb) y explica porqué se produce la salida correspondiente.