미역줄기의 이모저모
pwnable.kr cmd1 풀이 본문
1. 문제확인
리눅스에서 PATH environment가 뭐냐고?
일단 접속
2. 문제 분석
cmd1@pwnable:~$ 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
cmd1은 실행할 수 있고.. 또 cmd1_pwn이니까 cmd1을 통해서 flag를 구할 수 있겠다!
cmd1.c 코드를 살펴보면,
#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;
}
filter와 main 각각 나눠서 보자
filter
int filter(char* cmd){
int r=0;
r += strstr(cmd, "flag")!=0;
r += strstr(cmd, "sh")!=0;
r += strstr(cmd, "tmp")!=0;
return r;
}
main에서 받아온 cmd에 flag 있으면 0이 아닌 수를 반환, sh, tmp도 마찬가지 -> 0 반환되면 실패임
main
int main(int argc, char* argv[], char** envp){
putenv("PATH=/thankyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}
PATH를 /thankyouverymuch로 설정했다. 그리고 filter함수를 호출,
filter가 0이 아닌 값을 출력하면 0을 반환하고 -> 실패
아니면 system( argv[1] )를 하고 ->성공!
0을 반환.
여기서 putenv("PATH=/thankyouverymuch");
가 실행되면 어떻게 되는건가?
우선 왜 환경변수를 이용한걸까?
환경변수는 일종의 즐겨찾기이다.
가장 많이 쓰는 리눅스 명령어인 cat, ls, 등등은 모두 bin이라는 폴더 안에있는 명령이다!!!
그러면 원래는 /bin/cat, /bin/ls의 방식으로 실행시켜야 하지만, cat이나 ls로 실행시켜도 실행이 된다
이는 PATH에 이미 /bin이라고 명시되어있기 때문이다!
결국 우리가 하고싶은 일은 main함수 안에서 system(cat flag); 를 하는 것이다!!
지금 상황은 PATH가 /thankyouverymuch로 설정되어있기 때문에 argv[1]에 cat flag를 넣어도
/thankyouverymuch/cat flag가 된다.., 그전에 filter함수에서 걸림. (flag때문에)
3. 문제풀이
그럼 PATH를 /thankyouverymuch로 바꿨으니까.. 그냥 절대경로를 생략하지 않고 cat를 쓰면 되겠다!
그리고 *라는 필터링을 이용한다!
*은 와일드카드라는 뜻으로, fl* 로 입력하면 'fl로 시작하는 모든 파일에 접근해줘'는 뜻이 됩니다.
flag: mommy now I get what PATH environment is for :)
'Hacking > 포너블.kr 문제풀이' 카테고리의 다른 글
pwnable.kr passcode 풀이 (0) | 2024.02.02 |
---|---|
pwnable.kr lotto 풀이 (0) | 2024.02.01 |
pwnable.kr blackjack 풀이 (0) | 2024.02.01 |
pwnable.kr shellshock 풀이 (0) | 2024.02.01 |
pwnable.kr mistake 풀이 (0) | 2024.02.01 |