Sto provando a compilare un semplice esempio di overflow del buffer su una VM i386 Debian. L'eseguibile va bene, ma EIP non viene sovrascritto correttamente nonostante venga fornito un input sufficientemente grande da sovraccaricare il buffer e sovrascrivere l'EIP spinto nello stack. Ecco i miei comandi come root:
sysctl -w kernel.randomize_va_space=0
gcc test.c -z execstack -z norelro -fno-stack-protector -D_FORTIFY_SOURCE=0 -ggdb -o test
Come puoi vedere, ho:
- Crea lo stack eseguibile
- Canali dello stack rimossi
- Sistema ASLR disattivato
- Protezioni di relro rimosse
- Disabilita le protezioni FORTIFY_SOURCE di gcc
Ecco test.c:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char buf[128];
if(argc < 2) return 1;
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
Ho sperimentato stringhe di crash (solo tutte As) di lunghezza da 128-256. In gdb, l'EIP spinto non viene mai sovrascritto. Realisticamente dovrebbe essere solo una stringa di 132 byte per sovrascrivere EIP in quanto non ci sono altre variabili di stack locali.
C'è qualche altra protezione che devo disabilitare durante la compilazione? O c'è qualcos'altro da disabilitare con sysctl?