저는 linux와 c를 사용합니다. 먼저system()과 execve()의 차이점
, I 소프트 링크 빈/zsh을 나는 루트 실행 다음 프로그램으로 로그인,
둘째 쉬합니다.
#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 ;
}
셋째, 나는 정상 사용자 (안 루트)로 로그인합니다. 이제이 프로그램의 실행 파일을 사용하여 쓰기 권한이없는 파일을 제거하거나 다시 작성할 수 있습니다. 이처럼
:
./a.out text;\`echo \”Not right\”>text\`”
지금 내가 파일 "텍스트"로 "옳지 않다"쓸 수 있습니다. 나는 단지이 파일 읽기의 특권을 읽고이 파일의 권한을 기록했다.
넷째, 나는 의미 1. 내가 원하면 execve 대신 사용이 시간에 질문을 변경합니다.
그리고 위와 같은 일을하십시오. 하지만 이번에는 파일의 내용을 변경할 수 없습니다.
왜? 인터넷에서 Google을 검색했지만 시스템과 execve간에 다른 것을 찾을 수 없습니다.
[* system'] (http://linux.die.net/man/3/system)이 명령 *을 실행 한 다음에 *가 호출자에게 반환되는 것과는 다른 점이 무엇입니까? ['execve'] (http://linux.die.net/man/2/execve)는 호출자의 프로세스 데이터를 호출 된 프로세스로 대체하므로 더 이상 호출자가 없기 때문에 호출자에게 "반환"상태가 없습니다)? – WhozCraig
execve가 일반 사용자 권한을 사용하고 있지만 시스템이 루트 권한을 사용하고 있다는 것을 의미합니까? – littletiger
필요한 허가없이 파일을 덮어 쓸 수있는 명령은 언밸런스 (이상한) 따옴표가 있습니다. 그것은 당신이 의미하는 것을하지 않을 것입니다 ('echo'부분은 그대로 여러분의 프로그램에 의해 실행되지 않습니다). 테스트에 뭔가 문제가 있습니다. execve 또는 시스템은 권한을 변경하지 않습니다. (main에서'return' 전에'printf'를 추가하여 시스템과 execve의 차이를 확인하십시오.) – Mat