cmd1@prowl:~$ ls -l
total 20
-r-xr-sr-x 1 root cmd1_pwn 8513 Jul 14 2015 cmd1
-rw-r--r-- 1 root root 320 Mar 23 2018 cmd1.c
-r--r----- 1 root cmd1_pwn 48 Jul 14 2015 flag
들어가서 보니 3개의 파일이 있다 c코드를 보자
cmd1@prowl:~$ cat cmd1.c
#include
#include
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;
}
인자로 주어지는 것 중에 'flag' 'sh' 'tmp' 라는 단어가 들어가게 되면 프로그램이 종료되게 되어있다.
어떻게 해야할까
$PATH를 입력해보면 우리가 명령어를 쳤을 때 그 명령어가 존재하는지의 여부를 찾아보는 파일들의 경로가 나온다.
쉽게 말해서 ls를 입력했을 때
cmd1@prowl:~$ $PATH
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: No such file or directory
/usr/local/sbin
/usr/local/bin
/usr/bin:/sbin
/usr/games
/usr/local/games
/snap/bin
에 있는 파일들을 찾아보며 ls라는 파일(명령어 파일)이 있으면 그것을 실행하고, 만약 없다면 없다고 출력해준다.
이렇게 바로 명령어를 입력 못하도록 방해하는 구문이
putenv("PATH=/thankyouverymuch");
이 구문이다. 환경변수를 완전히 바꿔버린 것이다. 실제로 / 에 가서 thankyouverymuch를 찾아봐도 없다.
flag라는 단어도 못 쓰고 ls처럼 바로 명령어를 쓸 수 없다. 그렇다면 이렇게 풀면 된다.
ls처럼 바로 명령어를 넣지 못한다면 풀 경로를 입력해주면 된다. 우리가 필요한 명령어는 cat이다. cat은 /bin에 있다.
그리고 flag라는 단어를 못 쓰닌까 fl* 이렇게 우회하면 된다. 그래서 payload는
./cmd1 '/bin/cat fl*'
이렇게 된다.
'CTF 중점 스터디' 카테고리의 다른 글
N00bCTF - Simple_SQL Write-up (0) | 2019.11.28 |
---|---|
ctf-d_브리타니아의 원더랜드 Write_up (2) | 2019.11.26 |
ctflearn PIN Write Up (0) | 2019.11.24 |
N00bCTF - Simple md(5-1) Write-up (0) | 2019.11.20 |
Wargame.kr - strcmp - Write up (0) | 2019.11.18 |