Ho scritto un semplice programma c per testare un buffer overflow. Il mio obiettivo è sovrascrivere lo strappo in modo che punti all'inizio del buffer.
Il codice:
#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;
}
Quando scrivo
r python -c 'print "A"*264 + "BBBBBB"'
in gdb lo strappo viene sovrascritto correttamente con:
RIP: 0x424242424242 ('BBBBBB')
L'inizio del buffer è a 0x7ffffffede20.
Quindi ho provato
r python -c 'print "A"*264 + "\x20\xde\xfe\xff\xff\x7f"'
in gdb per sovrascrivere lo strappo ma non funziona più.
Questo è il contenuto di rip (copiato da gdb):
RIP: 0x7fffff050800 (<__libc_start_main+192>:
add al,BYTE PTR [rax])
Perché funziona con "BBBBBB" ma non con l'indirizzo? E ho anche provato
r 'python -c 'print "\x90"*264 + "\x08\xde\xfe\xff\xff\x7f"''
E per qualche strano motivo questo funziona di nuovo con l'indirizzo 0x7ffffffedf08. Ma non solo con quello di cui ho bisogno.
(Compilation: gcc mybof.c -fno-stack-protector -z execstack -o mybof)