본문 바로가기
포너블(pwnable)/CTF(pwnable.kr)

[Toddler's Bottle] cmd1 문제 풀이

by LIZ0904 2021. 5. 18.
반응형

문제

오늘의 문제는 리눅스의 PATH environment와 관련있는 문제로 예상된다.

 

 

문제 접속

ssh 주소로 접속을 했고, ls 명령을 통해 현재 위치 안의 파일을 확인해보면 flag, cmd1 실행파일, cmd1.c 파일 세개가 있다.

 

 

cmd1.c

cat 명령을 통해 cmd1.c 파일의 내용을 확인했다. filter 함수와 main 함수로 이루어져 있다.

main 함수에서 putenv를 통해 PATH를 설정하고, 인자 argv[1]을 fileter 함수를 통해 검사한다. 만약 fileter 함수를 통과하면 argv[1]을 system함수에 넣어 실행시켜준다. 우린 flag 파일을 읽어야 하니까 첫번째 인자에 "cat flag" 명령과 동일한 명령을 이끌어 내야한다. 

 

cat flag 인자를 넣어주었을 때 fileter의 결과를 봐보자. 만약 인자에 문자열 "flag", "sh", "tmp"가 있다면 r값은 0이 아니게 되어 main함수의 if문이 실행되게 된다. 때문에 "flag" 문자열이 들어가는 cat flag는 인자가 될 수 없다.

 

 

첫번째로 생각할 내용은 "flag"문자열을 사용하지 않고 flag 파일을 출력할 수 있는지에 대해 생각해봐야 한다. 리눅스 환경에서 *은 모든 문자를 의미한다는 것이다. 만약 [ cat a* ] 라는 명령을 실행시키면, a로 시작하는 모든 파일을 열람하게 해달라는 의미이다.

때문에 인자값으로 "cat f*" 만 넣어줘도 f로 시작하는 모든 파일을 출력해준다. 현재 디렉터리에 f로 시작하는 파일은 flag 밖에 없으니 flag의 내용이 뜰 것이고, "flag"가 아닌 "f*"로 인자값을 주기 때문에 filter 함수에서도 걸리지 않는다.

 

 

두번째로 생각할 부분은 main 함수 첫줄인 putenv("PATH=thankyouverymuch"); 이다. cat 명령은 /bin 디렉터리에 저장되어 있다.

echo $PATH 명령을 사용해 PATH 환경변수를 확인하면 위와 같이 나온다. 만약 cat이라는 명령어를 입력하면 순서대로 /usr/local/sbin -> /usr/local/bin -> ... 순으로 cat 명령이 존재하는지 찾다가, /bin 디렉터리에서 cat을 찾아 사용할 수 있다. 때문에 굳이 /bin/cat이라고 쓰지 않고도 cat 명령을 쓸 수 있는 것이다.

 

하지만 여기선 PATH를 변경해주었기 때문에 cat 명령 하나를 입력하면 명령을 찾을 수 없다. 때문에 /bin/cat이라고 입력해주어야 한다. 

 

flag 출력

인자값으로 "/bin/cat f*"를 입력해주면, system 함수가 실행시켜 flag가 출력된다!

 

성공

성공이다~~~

 

flag: mommy now I get what PATH environment is for :)

 

 

 

 

반응형

댓글