White Security
Cmd1 문제풀이 본문
Mommy! what is PATH environment in Linux? ssh cmd1@pwnable.kr -p2222 (pw:guest)
Toddler's Bottle 14번 문제
PATH 환경변수에 관한 문제입니다.
#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=/thankyouverymuch"); if(filter(argv[1])) return 0; system( argv[1] ); return 0; }
main 함수의 argc, argv는 익숙하지만
envp 변수는 낯선 분들이 계실겁니다.
envp 변수는 실행 환경변수를 전달하는 인자로
프로그램 내에서 환경변수 데이터를 확인할 수 있도록 합니다.
putenv 함수를 통해
PATH 환경변수의 내용을 변경하고
filter 함수를 사용해
flag, sh, tmp 세 단어를 필터링 하고 있습니다.
여기서 PATH는, 리눅스 및 기타 유닉스 시스템에서
사용하는 환경변수인데요.
쉘을 사용하여 프로그램을 실행할 때에
바이너리가 존재하는 경로를 PATH에 등록해 두면
절대경로를 모두 입력하거나
해당 폴더에 있지 않아도
바이너리 파일명만을 사용하여
간편하게 호출할 수 있도록 합니다.
덕분에 평소 리눅스에서
Bash 등을 사용하여
/bin 폴더에 존재하는 cat, ls 등의 명령어들을
절대경로를 이용하지 않고
마치 빌트인 함수인것 마냥
간편하게 사용할 수 있는 것이지요.
cmd1@ubuntu:~$ ./cmd1 "cat" sh: 1: cat: not found
따라서 PATH를 변경해버린
cmd1에서는 /bin 폴더 내에 속한
cat 등의 바이너리를 자동으로 탐색해 주지 않으므로
파일명 만으로 호출이 불가능합니다.
cmd1@ubuntu:~$ ./cmd1 "/bin/cat flag" cmd1@ubuntu:~$
따라서 절대경로를 이용해 프로그램을 호출해 주면 되는데
filter 함수를 통해, 인자에 flag가 속한 경우
프로그램이 종료되어 버리므로
플래그를 얻을 수 없습니다.
cmd1@ubuntu:~$ ./cmd1 "/bin/cat fl''ag" cmd1@ubuntu:~$ ./cmd1 "/bin/cat fla*g"
애스터리스크를 사용해
문자열 일부를 생략시키거나
중간에 더블 콜론 등을 끼워넣는 것으로
우회할 수 있었습니다.
'Wargame Writeups > pwnable.kr' 카테고리의 다른 글
Uaf 문제풀이 (0) | 2019.02.19 |
---|---|
Cmd2 문제풀이 (0) | 2019.02.11 |
Lotto 문제풀이 (0) | 2019.02.10 |
Blackjack 문제풀이 (0) | 2019.02.10 |
Coin1 문제풀이 (0) | 2019.02.09 |
Comments