Aún no he conseguido que se ejecute la dirección del RET sobreescrita. No sé si será por ele compilador gcc, he estado dando vueltas por google y la verdad no sé por dónde pueden ir los tiros.
Voy a intentar exponer el problema a ver si a alguien le ha pasado.
Este es el código vulnerable:
Código:
#include <stdio.h>
#include <string.h>
void copiar(char* b)
{
char buffer[16];
strcpy(buffer,b);
}
int main(int argc, char** argv)
{
copiar(argv[1]);
return 0;
}
La variable "buffer" es de 16bytes.
Ejecuto el gdb y pongo un break en la funcion "copirar"
Código:
(gdb) list
4 void copiar(char* b)
5 {
6 char buffer[16];
7 strcpy(buffer,b);
8 }
9
10
11 int main(int argc, char** argv)
12 {
13 copiar(argv[1]);
(gdb) break 6
(gdb) run $(perl -e 'print "A"x32')
Antes de ejecutar el strcpy miro la pila:
La direccion de la variable "buffer" en la funcion copiar es 0xbffff67c
Código:
(gdb) print &buffer
$1 = (char (*)[16]) 0xbffff67c
La direccíon de retorno a el main es 0x080483f4:
Código:
(gdb) disass main
Dump of assembler code for function main:
0x080483de <+0>: push %ebp
0x080483df <+1>: mov %esp,%ebp
0x080483e1 <+3>: sub $0x4,%esp
0x080483e4 <+6>: mov 0xc(%ebp),%eax
0x080483e7 <+9>: add $0x4,%eax
0x080483ea <+12>: mov (%eax),%eax
0x080483ec <+14>: mov %eax,(%esp)
0x080483ef <+17>: call 0x80483c4 <copiar>
0x080483f4 <+22>: mov $0x0,%eax
0x080483f9 <+27>: leave
0x080483fa <+28>: ret
End of assembler dump.
Ahora observo la pila en el breakpoint
Código:
esp 0xbffff674 0xbffff674
ebp 0xbffff68c 0xbffff68c
En la direccion 0xbffff67c comienza la varible "buffer" y en la direccion 0xbffff690 el RET
Código:
(gdb) x/50x $esp
0xbffff674: 0x00287ff4 0x08048410 0xbffff698 0x0015e985
0xbffff684: 0x0011eac0 0x0804841b 0xbffff698 0x080483f4
0xbffff694: 0xbffff89a 0xbffff718 0x00145ce7 0x00000002
0xbffff6a4: 0xbffff744 0xbffff750 0xb7fff848 0xbffff7b8
0xbffff6b4: 0xffffffff 0x0012cff4 0x0804822c 0x00000001
0xbffff6c4: 0xbffff700 0x0011e096 0x0012dad0 0xb7fffb28
0xbffff6d4: 0x00287ff4 0x00000000 0x00000000 0xbffff718
0xbffff6e4: 0x084b7a07 0xdf1f6378 0x00000000 0x00000000
0xbffff6f4: 0x00000000 0x00000002 0x08048310 0x00000000
0xbffff704: 0x00123cf0 0x00145c0b 0x0012cff4 0x00000002
0xbffff714: 0x08048310 0x00000000 0x08048331 0x080483de
0xbffff724: 0x00000002 0xbffff744 0x08048410 0x08048400
0xbffff734: 0x0011eac0 0xbffff73c
Sigo ejecutando:
Código:
(gdb) next
8 }
(gdb) x/50x $esp
0xbffff674: 0xbffff67c 0xbffff89a 0x41414141 0x41414141
0xbffff684: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff694: 0x41414141 0x41414141 0x00145c00 0x00000002
0xbffff6a4: 0xbffff744 0xbffff750 0xb7fff848 0xbffff7b8
0xbffff6b4: 0xffffffff 0x0012cff4 0x0804822c 0x00000001
0xbffff6c4: 0xbffff700 0x0011e096 0x0012dad0 0xb7fffb28
0xbffff6d4: 0x00287ff4 0x00000000 0x00000000 0xbffff718
0xbffff6e4: 0x084b7a07 0xdf1f6378 0x00000000 0x00000000
0xbffff6f4: 0x00000000 0x00000002 0x08048310 0x00000000
0xbffff704: 0x00123cf0 0x00145c0b 0x0012cff4 0x00000002
0xbffff714: 0x08048310 0x00000000 0x08048331 0x080483de
0xbffff724: 0x00000002 0xbffff744 0x08048410 0x08048400
0xbffff734: 0x0011eac0 0xbffff73c
Como vemos el RET (direccion 0xbffff690) se ha sobreescrito. Y como me pasaba en el comentario anterioir despues de escribir todas las "A", en byte siguiente lo sobre con ceros (ha pasado de 0x00145ce7 a 0x00145c00).
En el siguiente paso el programa "casca" pero sin que el EIP ejecute el RET:
Código:
Program received signal SIGSEGV, Segmentation fault.
0x080483dd in copiar (b=No se puede acceder a la memoria en la dirección 0x41414149
) at ejemplo.c:8
8 }
(gdb) info r
eax 0xbffff67c -1073744260
ecx 0x0 0
edx 0x21 33
ebx 0x287ff4 2654196
esp 0xbffff690 0xbffff690
ebp 0x41414141 0x41414141
esi 0x0 0
edi 0x0 0
eip 0x80483dd 0x80483dd <copiar+25>
eflags 0x10246 [ PF ZF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
La dirección donde se queda es el RET de la funcion copiar: eip 0x80483dd 0x80483dd <copiar+25>
Código:
(gdb) disass copiar
Dump of assembler code for function copiar:
0x080483c4 <+0>: push %ebp
0x080483c5 <+1>: mov %esp,%ebp
0x080483c7 <+3>: sub $0x18,%esp
0x080483ca <+6>: mov 0x8(%ebp),%eax
0x080483cd <+9>: mov %eax,0x4(%esp)
0x080483d1 <+13>: lea -0x10(%ebp),%eax
0x080483d4 <+16>: mov %eax,(%esp)
0x080483d7 <+19>: call 0x80482f4 <strcpy@plt>
0x080483dc <+24>: leave
=> 0x080483dd <+25>: ret
End of assembler dump.
Me podeis echar una mano.?? Gracias