오늘의 문제는 이전 문제인 cmd1의 flag를 이용해 들어가야 한다. 아래꺼 드래그 해서 보셈요들
flag of cmd1: mommy now I get what PATH environment is for :)
ssh 주소로 접속해준 뒤, ls 명령을 확인해보면 flag, cmd2 실행파일, cmd2.c 파일이 있음을 알 수 있다.
cat 명령을 이용해 cmd2.c 파일의 전체적인 내용을 확인했다. filter, delete_env, main 함수로 이루어져 있다. main 함수에서 delete_env() 함수를 실행하고, putenv 함수를 실행하고, filter을 거친 뒤, system 함수를 사용해 인자값을 실행시킨다.
int filter(char* cmd){
int r=0;
r += strstr(cmd, "=")!=0;
r += strstr(cmd, "PATH")!=0;
r += strstr(cmd, "export")!=0;
r += strstr(cmd, "/")!=0;
r += strstr(cmd, "`")!=0;
r += strstr(cmd, "flag")!=0;
return r;
}
첫번째로 filter 함수는 cmd1 문제와 비슷하다. 문자열 "=", "PATH", "export", "/", "`", "flag"가 포함되면, r 값이 0이 아니게 되어 main 함수의 if문이 실행된다. 즉, 이 문자열들은 인자값으로 넘겨주면 안된다.
extern char** environ;
void delete_env(){
char** p;
for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}
두번째로 delete_env() 함수에서 memset 함수를 사용하고 있다. mem함수는 메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수이며, 함수원형은 void* memset(void* ptr, int value, size_t num); 이다. 첫번째 인자 void* ptr은 세팅하고자 하는 메모리의 시작 주소, 두번째 인자 value는 메모리에 세팅하고자 하는 값, 세번째 인자 size_t_num은 길이를 의미한다.
delete_env 함수는 모든 환경변수를 0으로 만들어, 모든 환경변수를 제거한다.
export 명령은 환경 변수를 지정, 변경하거나 현재 정의되어 있는 환경 변수를 보여주는 명령이다. 위와 같이 인자값을 입력해주면 명령은 export라고 전달되지만 문자열 "export"로는 인식이 되지 않는다.
어쨌거나 export 명령의 결과를 보면 현재 환경변수는 PATH와 PWD 두개만 있는 것을 알 수 있다.
이 문제의 팁은 빌트인 커맨드(Command)에 있다. 명령어를 실행하는 명령 command는 -p 옵션을 사용하면 환경변수를 기본 정보로 초기화한다. 즉, command -p [명령]을 입력하면 default PATH로 해당 명령어로 실행된다는 것이다. 그럼 command -p cat flag를 쉘에서 입력하면 될까? 당연히 안된다! 아까 filter에서 "flag"를 사용하면 안된다고 했으니, "f*"로 대체해서 인자값을 전달해주자!
그럼 flag가 출력된다.
성공 오예! 뜬금없지만 남자친구랑 헤어져서 슬프다. X발...
flag: FuN_w1th_5h3ll_v4riabl3s_haha
'포너블(pwnable) > CTF(pwnable.kr)' 카테고리의 다른 글
[Toddler's Bottle] cmd1 문제 풀이 (0) | 2021.05.18 |
---|---|
[Toddler's Bottle] lotto 문제풀이 (0) | 2021.05.07 |
[Toddler's Bottle] blackjack 문제풀이 (0) | 2021.05.07 |
[Toddler's Bottle] coin1 (0) | 2021.05.06 |
[Toddler's Bottle] mistake 문제풀이 (0) | 2021.04.28 |
댓글