Wargame/pwnable.kr

[Pwnable.kr] cmd1 풀이 (1pt)

bjloed 2020. 7. 22. 10:54

 

 

풀이

다은은 cmd1.c의 코드이다.

#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;
}

 

filter 함수

매개 변수로 받은 cmd에 flag, sh, tmp라는 문자열이 하나라도 존재한다면 NULL byte를 리턴한다.

즉, flag, sh, tmp 문자열이 cmd에 존재하지 않아야 정상적으로 system 함수를 작동시킬 수 있다.

 

main 함수

환경변수 PATH의 값을 /thankyouverymuch로 만들어, 외부 명령어의 사용을 금지시킨다.

그 후, filter 함수에 argv[1]을 매개 변수로 넘겨준다. 만약, filter(argv[1])이 0이라면 프로그램을 종료한다.

아니라면, system( argv[1] ) 함수를 실행한다.


정말 간단하게 해결할 수 있는 문제다.

flag라는 문자열이 금지당했으므로, f*와 같은 형식으로 flag 문자열을 대체할 수 있을 것이다. (f* = f로 시작하는 문자열)

cat 명령어는 리눅스 외부 명령어이기 때문에 실행히 불가능하나, 절대 경로로 cat을 지정해준다면 사용할 수 있다.

완성된 argv[1]은 다음과 같다.