По крайней мере одна проблема не связана с переполнением буфера.
execve("/bin/sh", NULL, NULL);
Этот первый NULL становится argv запускаемого вами процесса.argv должен быть массивом строк, который оканчивается значением NULL.Таким образом, segfault может произойти, когда /bin/sh
запускается, пытается прочитать argv[0]
и разыменовывает NULL.
void g(void) {
char *argv[] = { "/bin/sh", NULL };
execve(argv[0], argv, NULL);
}
Вы также можете добавить -z execstack
в командную строку gcc, которая сообщит компоновщикуразрешить исполняемый стек.Вы также должны убедиться, что у вас есть инструкции, которые exit(1)
компилирует в вашей системе, если вы получили их где-то из руководства.