En FreeBSD no sé si hace lo de salvar el esp o no, pero seguro que intenta saltar a 0x48484848?, no será que hace un ret con esp = 0x48484848 o algo parecido?. Para salir de dudas:
x/1i $eip
En el momento que da el sigsegv. Un saludo.
Mira, estoy seguro que hace algo, sin embargo todavia no estoy completamente seguro de que hace, despues del prolog, ejecuta cosas que ni al caso pero bueno, preguntemosle esto a los que hacen gcc
Código:
(gdb) disas main
Dump of assembler code for function main:
0x080481b4 <main+0>: push %ebp
0x080481b5 <main+1>: mov %esp,%ebp
0x080481b7 <main+3>: sub $0x18,%esp
0x080481ba <main+6>: and $0xfffffff0,%esp
0x080481bd <main+9>: mov $0x0,%eax
0x080481c2 <main+14>: add $0xf,%eax
0x080481c5 <main+17>: add $0xf,%eax
0x080481c8 <main+20>: shr $0x4,%eax
0x080481cb <main+23>: shl $0x4,%eax
0x080481ce <main+26>: sub %eax,%esp
0x080481d0 <main+28>: sub $0x8,%esp
0x080481d3 <main+31>: mov 0xc(%ebp),%eax
0x080481d6 <main+34>: add $0x4,%eax
0x080481d9 <main+37>: pushl (%eax)
0x080481db <main+39>: lea 0xffffffe8(%ebp),%eax
0x080481de <main+42>: push %eax
0x080481df <main+43>: call 0x804973c <strcpy>
0x080481e4 <main+48>: add $0x10,%esp
0x080481e7 <main+51>: sub $0x8,%esp
0x080481ea <main+54>: lea 0xffffffe8(%ebp),%eax
0x080481ed <main+57>: push %eax
0x080481ee <main+58>: push $0x805b46a
0x080481f3 <main+63>: call 0x8049708 <printf>
0x080481f8 <main+68>: add $0x10,%esp
0x080481fb <main+71>: mov $0x0,%eax
0x08048200 <main+76>: leave
0x08048201 <main+77>: ret
End of assembler dump.
Dump of assembler code for function main:
0x080481b4 <main+0>: push %ebp
0x080481b5 <main+1>: mov %esp,%ebp
0x080481b7 <main+3>: sub $0x18,%esp
0x080481ba <main+6>: and $0xfffffff0,%esp
0x080481bd <main+9>: mov $0x0,%eax
0x080481c2 <main+14>: add $0xf,%eax
0x080481c5 <main+17>: add $0xf,%eax
0x080481c8 <main+20>: shr $0x4,%eax
0x080481cb <main+23>: shl $0x4,%eax
0x080481ce <main+26>: sub %eax,%esp
0x080481d0 <main+28>: sub $0x8,%esp
0x080481d3 <main+31>: mov 0xc(%ebp),%eax
0x080481d6 <main+34>: add $0x4,%eax
0x080481d9 <main+37>: pushl (%eax)
0x080481db <main+39>: lea 0xffffffe8(%ebp),%eax
0x080481de <main+42>: push %eax
0x080481df <main+43>: call 0x804973c <strcpy>
0x080481e4 <main+48>: add $0x10,%esp
0x080481e7 <main+51>: sub $0x8,%esp
0x080481ea <main+54>: lea 0xffffffe8(%ebp),%eax
0x080481ed <main+57>: push %eax
0x080481ee <main+58>: push $0x805b46a
0x080481f3 <main+63>: call 0x8049708 <printf>
0x080481f8 <main+68>: add $0x10,%esp
0x080481fb <main+71>: mov $0x0,%eax
0x08048200 <main+76>: leave
0x08048201 <main+77>: ret
End of assembler dump.
Si lo sobre escribe el eip
Código:
(gdb) run AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Starting program: /usr/home/luis/codigo AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Has escrito: AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Program received signal SIGSEGV, Segmentation fault.
0x48484848 in ?? ()
(gdb) x/1 $eip
0x48484848: Error accessing memory address 0x48484848: Bad address.
Starting program: /usr/home/luis/codigo AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Has escrito: AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Program received signal SIGSEGV, Segmentation fault.
0x48484848 in ?? ()
(gdb) x/1 $eip
0x48484848: Error accessing memory address 0x48484848: Bad address.
y tambien el ebp, pero ese no hay mucho que decir... mirar:
Código:
(gdb) info register
eax 0x0 0
ecx 0x0 0
edx 0x35 53
ebx 0x2 2
esp 0xbfbfe910 0xbfbfe910
ebp 0x47474747 0x47474747
esi 0xbfbfe960 -1077941920
edi 0x0 0
eip 0x48484848 0x48484848
eflags 0x10282 66178
cs 0x33 51
ss 0x3b 59
ds 0x3b 59
es 0x3b 59
fs 0x3b 59
gs 0x1b 27
(gdb)
eax 0x0 0
ecx 0x0 0
edx 0x35 53
ebx 0x2 2
esp 0xbfbfe910 0xbfbfe910
ebp 0x47474747 0x47474747
esi 0xbfbfe960 -1077941920
edi 0x0 0
eip 0x48484848 0x48484848
eflags 0x10282 66178
cs 0x33 51
ss 0x3b 59
ds 0x3b 59
es 0x3b 59
fs 0x3b 59
gs 0x1b 27
(gdb)
Ok salimos de Dudas...