Estoy tratando de entender cómo funciona en detalle un desbordamiento de búfer. Básicamente compilé el siguiente programa:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char buff[2];
if (argc >1) {
strcpy(buff, argv[1]);
printf("Parameter: %s\n",buff);
}
return 0;
}
con gcc -fno-stack-protector -Wall -o buff buff.c
.
Cuando abro el programa con gdb, y ejecuto el programa causando una falla de segmentación, encontré que el contenido del registro rip (puntero de instrucción) no se sobrescribe (es decir, no aparece como el rbp (puntero base)) :
(gdb) i r
rax 0x0 0
rbx 0x0 0
rcx 0x0 0
rdx 0x0 0
rsi 0x555555756260 93824994337376
rdi 0x1 1
rbp 0x4141414141414141 0x4141414141414141
rsp 0x7fffffffdde8 0x7fffffffdde8
r8 0x0 0
r9 0x22 34
r10 0xffffffde 4294967262
r11 0x246 582
r12 0x555555554580 93824992232832
r13 0x7fffffffdec0 140737488346816
r14 0x0 0
r15 0x0 0
rip 0x5555555546d7 0x5555555546d7 <main+77>
eflags 0x10206 [ PF IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
---Type <return> to continue, or q <return> to quit---
gs 0x0 0
Obvisouly ya deshabilité el ASLR (poniendo 0 en el randomize_va_space).