본문 바로가기
Security/pwnable.kr

[pwnable.kr] Toddler's Bottle - cmd1

by 단월໒꒱ 2022. 5. 7.

이번에는 cmd1 문제를 풀어보았다.

 

 

 

 

문제를 읽어보니 리눅스에서 PATH enviornment가 뭐냐고 묻고 있다.

아마도 이번 문제는 이와 관련한 문제인 것 같다.

 

아래에 적혀있는 명령어로 접속해준다.

 

 

 

 

접속 완료했다.

 

 

 

 

파일 리스트는 이 정도 있다는 것을 확인한 뒤 cmd1.c 파일의 내용을 살펴봤다.

 

 

 

 

먼저 main 함수를 살펴보았다.

 

 

int main(int argc, char* argv[], char** envp){
        putenv("PATH=/thankyouverymuch");
        if(filter(argv[1])) return 0;
        system( argv[1] );
        return 0;
}

 

 

먼저, 낯선 함수 putenv를 살펴보았다.

putenv는 환경변수의 내용을 수정하거나 추가하는데 사용된다. key=value로 구성되어 있으며 위의 코드는 PATH라는 key에 /thankyouverymuch라는 value를 갖고있다고 볼 수 있다.

 

환경변수 : 여러 셸 스크립트나 프로그램들이 자신의 행동방식을 변경할 때 기초하는 자료

                사용자가 자신의 환경을 설정할 때도 환경변수들이 사용된다.

 

putenv 함수로 환경변수를 "PATH=/thankyouverymuch"로 바꿔주었다.

filter 함수에 argv[1] 값을 인자로 넘겨주고 리턴값이 0이면 argv[1]을 실행한다.

 

 

 

다음으로 filter 함수를 살펴보았다.

 

 

int filter(char* cmd){
        int r=0;
        r += strstr(cmd, "flag")!=0;
        r += strstr(cmd, "sh")!=0;
        r += strstr(cmd, "tmp")!=0;
        return r;
}

 

 

일단, strstr이라는 낯선 함수가 있으므로 한번 알아보았다.

 

strstr(대상문자열, 검색할문자열)로 사용하며, 검색한 문자열을 찾으면 그 문자열로 시작하는 문자열의 포인터를 반환한다.

검색 대상이 없으면 NULL을 반환한다.

 

filter 함수에 들어온 값이 flag, sh, tmp를 포함하고 있으면 양수, 포함되어 있지 않으면 0을 반환한다.

 

 

 

flag를 보려면 cat flag를 해야한다.

일단은 두 가지 방법으로 cat flag를 해보았다.

 

 

 

 

이렇게 값을 줄 경우에는 cat 명령어에 대해 not found가 뜨는데, 이는 환경변수가 바뀌어서 그렇다고 한다.

 

 

 

 

이렇게 값을 줄 경우에는 filter 함수에서 필터링되었기 때문에 바로 종료된다.

 

 

환경 변수가 바뀐 경우에는 경로를 다시 바꿔주거나 절대경로를 써주면 된다고 하는데, 절대경로가 훨씬 간단해보여서 일단은 이 방법을 사용하기로 했다.

검색을 해보니 cat 명령어는 bin 디렉터리에 있다고 하니 "/bin/cat 파일이름" 이런 식으로 사용하면 될 듯 싶다.

 

그리고 필터링을 피하기 위해 와일드카드 *를 사용할 수 있다.

f*로 나타내면 f로 시작하는 파일들을 뜻하게 된다. 

탐색하는 디렉터리 내에 flag 외에 f로 시작하는 다른 파일은 없으므로 f*로 나타내준다.

 

 

 

 

성공적으로 flag를 획득할 수 있었다.

 

 

 

 

획득한 flag의 내용을 입력해주니

 

 

 

 

문제를 해결하고 포인트를 얻을 수 있었다.

(무심코 확인을 눌러버려서 포인트 획득 창을 넘겨버렸다...)

 

 

 

 

 

댓글