2014-10-19 9 views
2

저는 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\`” 

지금 내가 파일 "텍스트"로 "옳지 않다"쓸 수 있습니다. 나는 단지이 파일

enter image description here

읽기의 특권을 읽고이 파일의 권한을 기록했다. enter image description here

넷째, 나는 의미 1. 내가 원하면 execve 대신 사용이 시간에 질문을 변경합니다.

그리고 위와 같은 일을하십시오. 하지만 이번에는 파일의 내용을 변경할 수 없습니다.

왜? 인터넷에서 Google을 검색했지만 시스템과 execve간에 다른 것을 찾을 수 없습니다.

+1

[* system'] (http://linux.die.net/man/3/system)이 명령 *을 실행 한 다음에 *가 호출자에게 반환되는 것과는 다른 점이 무엇입니까? ['execve'] (http://linux.die.net/man/2/execve)는 호출자의 프로세스 데이터를 호출 된 프로세스로 대체하므로 더 이상 호출자가 없기 때문에 호출자에게 "반환"상태가 없습니다)? – WhozCraig

+0

execve가 일반 사용자 권한을 사용하고 있지만 시스템이 루트 권한을 사용하고 있다는 것을 의미합니까? – littletiger

+0

필요한 허가없이 파일을 덮어 쓸 수있는 명령은 언밸런스 (이상한) 따옴표가 있습니다. 그것은 당신이 의미하는 것을하지 않을 것입니다 ('echo'부분은 그대로 여러분의 프로그램에 의해 실행되지 않습니다). 테스트에 뭔가 문제가 있습니다. execve 또는 시스템은 권한을 변경하지 않습니다. (main에서'return' 전에'printf'를 추가하여 시스템과 execve의 차이를 확인하십시오.) – Mat

답변

3

system은 문자열을 구문 분석하고 따옴표 및 변수 보간 등을 처리하기 위해 쉘을 호출합니다. execve에 해당하지 않습니다. 프로그램을 호출 된 프로그램으로 대체하고 지정된 인수 문자열을 정확하게 전달합니다. 즉. 따옴표를 해석하지 않습니다.

2

너는 chmod 4755 a.out라고 했지. 즉, setuid 비트를 설정하면 프로그램은 항상 루트 권한으로 실행되며 text에 대한 쓰기 권한이 있습니다. 역 인용 부호가있는 문자열은 쉘에 전달되어 text에 쓰는 명령으로 해석합니다.

execve이 텍스트에 쓰지 않는 이유는 해당 인수를 셸 명령으로 해석하지 않으며 '특별한 의미가 없습니다.