Yozzang의 해킹일기 💻
article thumbnail
Published 2022. 7. 13. 00:19
Pwnable (15. cmd2) Wargame/Pwnable
728x90

이번 포스트에서는 Pwnable의 cmd2 문제에 대해 다루겠다.

 


문제 코드는 다음과 같다.

#include <stdio.h>
#include <string.h>

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

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

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

## 문제 해석 :

문제 코드를 살펴 보니, "=", "PATH", "export", "/", "`", "flag"를 필터링하는 filter() 함수가 있고 delete_env()와 putenv() 함수를 통해 환경변수를 초기화하고 있다.

또한 우리의 입력(argv[1])을 실행해주는 system() 함수도 존재한다.

## 문제 풀이 :

필터링을 우회하여 flag를 실행해주면 된다. 여기서 리눅스의 command 명령어를 통해 쉽게 해결할 수 있다.

command

command의 -p 옵션을 보면 PATH와 상관없이 본적인 standard 유틸리티를 모두 찾아 수행한다고 되어 있다. 즉, 명령어의 경로와 상관없이 바로 사용할 수 있게 해준다는 뜻이다.

또한 flag가 필터링 처리되어 있으므로 "*"라는 와일드 카드를 이용하여 필터링을 우회하면 된다.

## 최종 결과 : 

### 공격문 : ./cmd2 "command -p cat fl*"

### 실행 결과 :

공격 실행

Flag = FuN_w1th_5h3ll_v4riabl3s_haha

'Wargame > Pwnable' 카테고리의 다른 글

Pwnable (17. memcpy)  (0) 2022.07.21
Pwnable (16. uaf)  (0) 2022.07.20
Pwnable (14. cmd1)  (0) 2022.07.12
Pwnable (13. lotto)  (0) 2022.07.11
Pwnable (12. blackjack)  (0) 2022.07.10
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!