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.