Esta actividad no es para entregar. Este es un problema tipo examen.
Se tiene el siguiente programa en lenguaje C para un sistema x86 de 32 bits:
01: #include <stdio.h> 02: 03: void super_punch(void) { 04: static int c = 0; 05: int s[1] = { 0xdeadbeaf }; 06: s[2] += (c < 3 ? -17: 12); 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 $ebp $1 = (void *) 0xbffff3e8 (gdb) p &s[0] $2 = (int *) 0xbffff3e4 (gdb) x/2xw $ebp 0xbffff3e8: 0xbffff408 0x08048445 (gdb) x/3xw &s[0] 0xbffff3e4: 0xdeadbeaf 0xbffff408 0x08048445 (gdb) disassemble /m main Dump of assembler code for function main: 10 int main(void) { 0x0804841f <main+0>: push ebp 0x08048420 <main+1>: mov ebp,esp 0x08048422 <main+3>: and esp,0xfffffff0 0x08048425 <main+6>: sub esp,0x10 11 puts("She loves you,"); 0x08048428 <main+9>: mov DWORD PTR [esp],0x8048520 0x0804842f <main+16>: call 0x8048318 <puts@plt> 12 puts("yeah,"); 0x08048434 <main+21>: mov DWORD PTR [esp],0x804852f 0x0804843b <main+28>: call 0x8048318 <puts@plt> 13 super_punch(); 0x08048440 <main+33>: call 0x80483e4 <super_punch> 14 puts("And you know you should be glad."); 0x08048445 <main+38>: mov DWORD PTR [esp],0x8048538 0x0804844c <main+45>: call 0x8048318 <puts@plt> 15 return 0; 0x08048451 <main+50>: mov eax,0x0 16 } 0x08048456 <main+55>: leave 0x08048457 <main+56>: ret 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.
La salida producida es:
She loves you, yeah, yeah, yeah, yeah,
La explicación queda como ejercicio.