본문 바로가기

Pwnable.kr

Pwnable.kr [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;
}

이게 cmd1부터 그렇게 푸니까 힘들게 삽질하고 있었음.

 

$PATH를 이용할 게 아니라, cmd1에서 /bin/cat 형식으로 전체 경로를 주면서 문제를 푸는 풀이가 많았고

그래서 여기서 '/' filter가 추가된 상황으로 보는 게 맞을 것 같다.

 

어쨌든, 지금 PATH는 실제로 없는 경로로 설정되어있고,

system 함수가 명령어를 실행하려면 경로까지 포함이 되어야 하는데,

/는 필터가 되어있으므로 /를 헥스값으로 전달하던가 (echo로도 가능)

아니면 command라는 명령어의 -p옵션을 사용할 경우 default PATH 경로로 명령어를 찾게 된다. 

그런 식으로 할 수 있고, flag 필터의 경우 *등의 정규표현식을 사용해서 가능하다. 

 

한가지 이해 안 되는건, $PATH명령어가 먹지 않는다. 

원래 이런 식으로 하려고 했는데, 변수값으로 바꿔서 뱉지 않음...

위의 경우 system ( $HOME ) 이 실행되고, 결과가 없으므로 안 나오는 것인데,

아래는 아예 not found가 되는 게 이해가 안 됨 ㅠ

예상하기로는, 이어져있는 문자열로 보이지만,

해석은 한 번에 못하는 것 같긴 한데...

'Pwnable.kr' 카테고리의 다른 글

Pwnable.kr [memcpy]  (0) 2019.05.08
Pwnable.kr [uaf]  (0) 2019.05.03
Pwnable.kr [cmd1]  (0) 2019.05.02
Pwnable.kr [lotto]  (0) 2019.05.02
Pwnable.kr [blackjack]  (0) 2019.05.01