Escribí un programa c simple para probar un desbordamiento de búfer. Mi objetivo es sobrescribir el rip para que apunte al principio del búfer.
El código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv) {
char buffer[256];
strcpy(buffer, argv[1]);
printf("INPUT: %s\n", argv[1]);
return 0;
}
cuando escribo
r python -c 'print "A"*264 + "BBBBBB"'
en gdb el rip se sobrescribe correctamente con:
RIP: 0x424242424242 ('BBBBBB')
El comienzo del búfer está en 0x7ffffffede20.
Así que lo intenté
r python -c 'print "A"*264 + "\x20\xde\xfe\xff\xff\x7f"'
en gdb para sobrescribir el rip pero ya no funciona.
Este es el contenido de rip (copiado de gdb):
RIP: 0x7fffff050800 (<__libc_start_main+192>:
add al,BYTE PTR [rax])
¿Por qué funciona con el "BBBBBB" pero no con la dirección? Y también lo intenté
r 'python -c 'print "\x90"*264 + "\x08\xde\xfe\xff\xff\x7f"''
Y por alguna extraña razón, esto funciona de nuevo con la dirección 0x7ffffffedf08. Pero no solo con el que necesito.
(Compilación: gcc mybof.c -fno-stack-protector -z execstack -o mybof)