생초보 pwnable.kr - cmd1 write-up
필요 지식
1. 환경 변수 $PATH
리눅스의 영구 환경 변수 중 하나인 PATH입니다.
리눅스의 명령어인 ls, cat, echo 등은 모두 일종의 리눅스에 내장된 프로그램입니다. 이러한 프로그램들을 우리는 별도의 경로 지정 없이 명령어 형식으로 쓰고 있습니다. 그렇게 할 수 있는 이유가 이 PATH 환경 변수입니다. 위 사진에 PATH를 보시면 여러 경로들이 :(콜론)을 통해서 구분되고 있습니다. 우리가 만약 cat 명령어를 입력하면 쉘은 저 경로중 하나에서 cat 프로그램을 찾고 자동으로 /bin/cat을 만들어서 실행시켜 줍니다. 추가로 우리가 만든 프로그램을 명령어처럼 사용하려면 이 PATH에 내 프로그램의 경로를 넣어주면 됩니다.
export PATH=/home/kali # 프로그램이 있는 디렉토리
2. 와일드카드
와일드카드는 컴퓨터에 문자열을 적을 때 문자열을 대체하여 여러 파일을 지정하거나 불특정한 파일을 지정할 때 사용할 수 있습니다. 정규표현식을 알면 더욱더 이해하기 쉽습니다. 리눅스에서도 이러한 와일드카드 기능을 지원하고 명령어 작성이나 파일을 찾는데 유용하게 사용될 수 있습니다. 여기서는 몇 가지 와일드카드만 알아보겠습니다..
* | 0개 이상의 문자를 대체 |
? | 1개의 문자를 대체 |
hello hellowhales.c
hell* -> hello hellowhales.c
hell? -> hello
Write-Up
문제의 제목과 내용을 보니 cmd에서 PATH 환경변수에 관한 문제라는 것을 짐작해 볼 수 있습니다.
파일은 역시 3개가 있군요. cmd1.c를 보도록 하겠습니다.
코드를 보면 putenv로 PATH를 새로 설정해주고 filter() 함수를 통해서 argv [1] 값에 flag, sh, tmp의 문자열이 포함된 값이 들어오면 r값을 증가시킵니다. r값이 증가돼서 리턴되면 if문이 true가 돼서 프로그램이 그대로 종료됩니다. if문을 그대로 넘어와야 system(argv [1])이 실행됩니다.
문제는 PATH값이 더럽혀지고 filter가 작동되는 상태에서 cat flag를 어떻게 system에 넣어줄지가 관건입니다. PATH가 이상한값으로 바뀌었기 때문에 cat을 그냥 사용할 수 없습니다.
따라서 bin 디렉토리의 cat 프로그램을 절대경로를 통해서 실행시켜줘야 합니다. 이제 /bin/cat을 실행할 수 있지만 다음은 flag 값을 주는 방법입니다. 필터가 있으므로 flag를 온전히 입력할 수는 없고 와일드카드를 통해 우회하도록 하겠습니다.
이렇게 " "로 감싸줘야 argv[1]에 한꺼번에 넣을 수 있습니다. 또 재밌는 점은 cmd1을 통해 바뀐 PATH값을 쳐보면
이렇게 fuckyouverymuch라는 재밋는 값이 나옵니다. 문제에서는 thankyouverymuch인데 말이죠. 이렇게 바뀌는 이유는 잘 모르겠습니다...
After Review
문제 자체는 워낙 간단하고 명료해서 방향잡는게 어렵지는 않았습니다만... 역시나 입력에서 헤맸습니다. argv에 띄어쓰기를 포함해서 넣을라면 " "를 써야되는 것을 몰랐거든요. 저 부분에서 막혀서 결국 다른 분들의 write-up을 보고 말았네요. 보고나니 화나 더군요. 이렇게 간단한데 어쨋든 그래도 이제는 알았으니까 만족하겠습니다.