Soy principiante en hazañas. Así que tuve el tipo de programa simple en C
#include <stdio.h>
void func(){
printf("asd");
}
main(){
char buf[100];
scanf("%s", &buf);
}
Mi objetivo es ejecutar el func () e imprimir asd. Con 116 'A', escribí sobre el EIP pero cuando cambio los últimos 4 A con la dirección de memoria de la función (en orden inverso) y ejecuto el programa nuevamente, el EIP es algo completamente diferente. Aquí están los detalles del formulario GDB:
Starting program: /root/Documents/C/overflow/stack
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) info registers
eax 0x1 1
ecx 0x1 1
edx 0xb7fbd354 -1208233132
ebx 0xb7fbbff4 -1208238092
esp 0xbffff4d0 0xbffff4d0
ebp 0x41414141 0x41414141
esi 0x0 0
edi 0x0 0
eip 0x41414141 0x41414141
Con dirección de la función:
(gdb) disas func
Dump of assembler code for function func:
0x0804846c <+0>: push %ebp
0x0804846d <+1>: mov %esp,%ebp
0x0804846f <+3>: sub $0x18,%esp
0x08048472 <+6>: movl $0x8048530,(%esp)
0x08048479 <+13>: call 0x8048340 <printf@plt>
0x0804847e <+18>: leave
0x0804847f <+19>: ret
Starting program: /root/Documents/C/overflow/stack
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6c\x84\x04\x08
Program received signal SIGSEGV, Segmentation fault.
0x6336785c in ?? ()
Si agrego más A a la cadena, el EIP comienza a desbordarse con A otra vez, quiero decir
Adding 1 A EIP = 0x36785c41
Adding 2 A's EIP = 0x785c4141
Adding 3 A's EIP = 0x78414141
Adding 4 A's EIP = 0x41414141
Estoy ejecutando Linux, no eliminé ni modifiqué nada en el kernel, así que hay mis protecciones. Además, no desactivé ninguna función en gcc, y el compilador es gcc = D.
Cualquier ayuda es bienvenida. Gracias de antemano.