풀이
다은은 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 함수
매개 변수로 받은 cmd에 flag, sh, tmp라는 문자열이 하나라도 존재한다면 NULL byte를 리턴한다.
즉, flag, sh, tmp 문자열이 cmd에 존재하지 않아야 정상적으로 system 함수를 작동시킬 수 있다.
main 함수
환경변수 PATH의 값을 /thankyouverymuch로 만들어, 외부 명령어의 사용을 금지시킨다.
그 후, filter 함수에 argv[1]을 매개 변수로 넘겨준다. 만약, filter(argv[1])이 0이라면 프로그램을 종료한다.
아니라면, system( argv[1] ) 함수를 실행한다.
정말 간단하게 해결할 수 있는 문제다.
flag라는 문자열이 금지당했으므로, f*와 같은 형식으로 flag 문자열을 대체할 수 있을 것이다. (f* = f로 시작하는 문자열)
cat 명령어는 리눅스 외부 명령어이기 때문에 실행히 불가능하나, 절대 경로로 cat을 지정해준다면 사용할 수 있다.
완성된 argv[1]은 다음과 같다.
'Wargame > pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] cmd2 풀이 (9pt) (0) | 2020.07.22 |
---|---|
[Pwnable.kr] coin1 풀이 (6pt) (0) | 2020.07.22 |
[Pwnable.kr] lotto 풀이 (2pt) (0) | 2020.07.22 |
[Pwnable.kr] blackjack 풀이 (1pt) (0) | 2020.07.21 |
[Pwnable.kr] shellshock 풀이 (1pt) (0) | 2020.07.21 |