이번에는 cmd1 문제를 이어 cmd2 문제를 풀어보았다.
대충 system command shell을 샀는데 필터 때문에 갖고 놀지 못한다는 것 같다.
이번에도 필터링 관련한 문제인 것 같다.
문제에 적혀있는 명령어로 접속해준다.
접속 완료했다.
파일 리스트는 이 정도 있다는 것을 확인한 뒤 cat으로 cmd2.c 내용을 살펴보았다.
먼저 main 함수를 살펴보았다.
int main(int argc, char* argv[], char** envp){
delete_env();
putenv("PATH=/no_command_execution_until_you_become_a_hacker");
if(filter(argv[1])) return 0;
printf("%s\n", argv[1]);
system( argv[1] );
return 0;
}
delete_env 함수가 있는데, 이거는 이따가 살펴볼 거니 넘어가자.
이전 cmd1 문제에서 나왔던 putenv 함수가 나왔는데, 이 함수로 환경변수를 "PATH=/no_command_execution_until_you_ become_a_hacker"로 바꿔주었다는 걸 알 수 있다.
filter 함수에 argv[1] 값을 인자로 넘겨주고, 리턴값이 0이면 argv[1]을 실행한다.
다음으로 filter 함수를 살펴보았다.
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;
}
저번에 나왔던 strstr 함수가 나왔다.
strstr 함수는 검색한 문자열을 찾으면, 그 문자열로 시작하는 문자열의 포인터를 반환하는 함수로, 검색 대상이 없으면 NULL을 반환한다.
filter 함수에 들어온 값이 =, PATH, export, /, `, flag를 포함하고 있으면 양수, 포함되어 있지 않으면 0을 반환한다.
그러니까, 위의 값들이 포함되지 않도록 해야 한다.
마지막으로 delete_env 함수를 살펴보았다.
void delete_env(){
char** p;
for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}
일단, memset이라는 낯선 함수가 있어서 알아보았다.
memset(ptr, value, size)로 사용하며, ptr은 메모리의 크기를 변경할 포인터, value는 초기화 값, size는 초기화 크기 반환 값이다.
이 함수를 이용하면 메모리값을 원하는 크기만큼 특정 값으로 초기화시켜줄 수 있다.
아무튼, 이 함수로 인하여 외부 환경변수를 모두 제거한다는 것을 알 수 있다.
웬만한건 다 제한되어서 마땅히 써볼만한 명령어가 없어서 구글링으로 우회하는 방법을 찾아보니 command 명령어를 사용해볼 수 있다고 해서 help로 사용설명을 보았다.
이 중에서 옵션 -p를 사용할 경우, PATH의 기본값을 사용할 수 있다고 한다.
이를 토대로 command -p 를 넣고 저번처럼 와일드카드 *를 사용하여 필터링을 우회해보았다.
성공적으로 flag를 획득할 수 있었다.
획득한 flag의 내용을 입력해주니
문제를 해결하고 포인트를 얻을 수 있었다.
'Security > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Toddler's Bottle - passcode (0) | 2022.06.19 |
---|---|
[pwnable.kr] Toddler's Bottle - leg (0) | 2022.06.19 |
[pwnable.kr] Toddler's Bottle - cmd1 (0) | 2022.05.07 |
[pwnable.kr] Toddler's Bottle - bof (0) | 2022.05.07 |
[pwnable.kr] Toddler's Bottle - input (0) | 2022.05.05 |
댓글