본문 바로가기
Security/pwnable.kr

[pwnable.kr] Toddler's Bottle - cmd2

by 단월໒꒱ 2022. 5. 7.

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

 

 

 

 

대충 system command shell을 샀는데 필터 때문에 갖고 놀지 못한다는 것 같다.

이번에도 필터링 관련한 문제인 것 같다.

 

문제에 적혀있는 명령어로 접속해준다.

 

 

 

 

접속 완료했다.

 

 

 

 

파일 리스트는 이 정도 있다는 것을 확인한 뒤 cat으로 cmd2.c 내용을 살펴보았다.

 

 

 

 

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

 

 

int main(int argc, char* argv[], char** envp){
        delete_env();
        putenv("PATH=/no_command_execution_until_you_become_a_hacker");
        if(filter(argv[1])) return 0;
        printf("%s\n", argv[1]);
        system( argv[1] );
        return 0;
}

 

 

delete_env 함수가 있는데, 이거는 이따가 살펴볼 거니 넘어가자.

이전 cmd1 문제에서 나왔던 putenv 함수가 나왔는데, 이 함수로 환경변수를 "PATH=/no_command_execution_until_you_ become_a_hacker"로 바꿔주었다는 걸 알 수 있다.

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

 

 

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

 

 

int filter(char* cmd){
        int r=0;
        r += strstr(cmd, "=")!=0;
        r += strstr(cmd, "PATH")!=0;
        r += strstr(cmd, "export")!=0;
        r += strstr(cmd, "/")!=0;
        r += strstr(cmd, "`")!=0;
        r += strstr(cmd, "flag")!=0;
        return r;
}

 

 

저번에 나왔던 strstr 함수가 나왔다.

strstr 함수는 검색한 문자열을 찾으면, 그 문자열로 시작하는 문자열의 포인터를 반환하는 함수로, 검색 대상이 없으면 NULL을 반환한다.

 

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

그러니까, 위의 값들이 포함되지 않도록 해야 한다.

 


마지막으로 delete_env 함수를 살펴보았다.

 

 

void delete_env(){
        char** p;
        for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}

 

 

일단, memset이라는 낯선 함수가 있어서 알아보았다.

 

memset(ptr, value, size)로 사용하며, ptr은 메모리의 크기를 변경할 포인터, value는 초기화 값, size는 초기화 크기 반환 값이다.

이 함수를 이용하면 메모리값을 원하는 크기만큼 특정 값으로 초기화시켜줄 수 있다.

 

아무튼, 이 함수로 인하여 외부 환경변수를 모두 제거한다는 것을 알 수 있다.

 

 

웬만한건 다 제한되어서 마땅히 써볼만한 명령어가 없어서 구글링으로 우회하는 방법을 찾아보니 command 명령어를 사용해볼 수 있다고 해서 help로 사용설명을 보았다.

 

 

 

 

이 중에서 옵션 -p를 사용할 경우, PATH의 기본값을 사용할 수 있다고 한다.

 

이를 토대로 command -p 를 넣고 저번처럼 와일드카드 *를 사용하여 필터링을 우회해보았다.

 

 

 

 

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

 

 

 

 

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

 

 

 

 

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

 

 

 

 

 

 

댓글