728x90
이번 포스트에서는 Pwnable의 cmd2 문제에 대해 다루겠다.
문제 코드는 다음과 같다.
#include <stdio.h>
#include <string.h>
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;
}
extern char** environ;
void delete_env(){
char** p;
for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}
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;
}
## 문제 해석 :
문제 코드를 살펴 보니, "=", "PATH", "export", "/", "`", "flag"를 필터링하는 filter() 함수가 있고 delete_env()와 putenv() 함수를 통해 환경변수를 초기화하고 있다.
또한 우리의 입력(argv[1])을 실행해주는 system() 함수도 존재한다.
## 문제 풀이 :
필터링을 우회하여 flag를 실행해주면 된다. 여기서 리눅스의 command 명령어를 통해 쉽게 해결할 수 있다.
command의 -p 옵션을 보면 PATH와 상관없이 기본적인 standard 유틸리티를 모두 찾아 수행한다고 되어 있다. 즉, 명령어의 경로와 상관없이 바로 사용할 수 있게 해준다는 뜻이다.
또한 flag가 필터링 처리되어 있으므로 "*"라는 와일드 카드를 이용하여 필터링을 우회하면 된다.
## 최종 결과 :
### 공격문 : ./cmd2 "command -p cat fl*"
### 실행 결과 :
Flag = FuN_w1th_5h3ll_v4riabl3s_haha
'Wargame > Pwnable' 카테고리의 다른 글
Pwnable (17. memcpy) (0) | 2022.07.21 |
---|---|
Pwnable (16. uaf) (0) | 2022.07.20 |
Pwnable (14. cmd1) (0) | 2022.07.12 |
Pwnable (13. lotto) (0) | 2022.07.11 |
Pwnable (12. blackjack) (0) | 2022.07.10 |