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

Buffer overflow

Esta actividad no es para entregar. Este es un problema tipo examen.

Problema

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.

Solución

La salida producida es:

She loves you,
yeah,
yeah,
yeah,
yeah,

La explicación queda como ejercicio.

© 1996-2010 por Ariel Ortiz Ramírez (ariel.ortiz@itesm.mx)
Desarrollado en Django | Licencia de Creative Commons | XHTML válido | CSS válido