Я использую линукс и с.
Сначала я подключаю bin/zsh к sh
Во-вторых, я вхожу в систему как root и запускаю следующую программу.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *v[3];
if(argc < 2) {
printf("Please type a file name.\n");
return 1;
}
v[0] = "/bin/cat"; v[1] = argv[1]; v[2] = 0;
/* Set q = 0 for system(), and q = 1 for execve */
int q = 0;
if (q == 0){
char *command = malloc(strlen(v[0]) + strlen(v[1]) + 2);
sprintf(command, "%s %s", v[0], v[1]);
system(command);
}
else execve(v[0], v, 0);
return 0 ;
}
В-третьих, я вхожу в систему как обычный пользователь (не root). Теперь я могу удалить или перезаписать файл, для которого у меня нет прав запись, используя исполняемый файл этой программы.
Как это:
./a.out text;\`echo \”Not right\”>text\`”
Теперь я могу написать "Неправильно" в файл "текст". У меня есть только права на чтение этого файла
Права на чтение и запись этих файлов.
В-четвертых, я изменил q на 1. Это означает, что на этот раз вместо этого я использую execve.
И сделать то же самое, что и выше. Но на этот раз я не могу изменить содержимое файла.
Почему? Я гуглю в инете, но не могу найти разницы между system и execve.
system
запускает команду и затем возвращает вызывающему, в то время какexecve
заменяет данные вызывающего процесса на вызываемый процесс, тем самым не имея состояния возврата для вызывающего (поскольку вызывающего больше нет)? - person WhozCraig   schedule 19.10.2014echo
не будет запускаться вашей программой как есть). Что-то не так с вашими тестами, execve или система ничего не меняет в отношении privs. (Добавьтеprintf
прямо передreturn
в main, чтобы увидеть разницу между system и execve.) - person Mat   schedule 19.10.2014ls -l text
до и после изменения? - person luser droog   schedule 19.10.2014