No img


[pwnable.kr] Toddler's Bottle - cmd2 문제

Posted by bonggang | 2019. 11. 28. 16:19

문제


https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr

 

문제 풀이


접속

 

ssh cmd2@pwnable.kr -p2222

 

 

코드 확인

 

#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, export, /, ', flag)

- delete_env()로 인해 환경변수를 설정해주는 것도 불가능하다.

- / 문자열 필터링만 우회한다면 앞 문제에서 사용한 와일드카드를 활용한 풀이가 가능할 것 같다.

 

1. read()

- read 변수: 표준 입력에서 한 줄을 읽어서 변수에 저장한다.

- read 변수1 변수2: 표준 입력에서 한 줄을 읽어 첫 단어는 변수1에 나머지는 변수2에 저장한다.

즉, argv[1]에 값은 'read x; $x'지만 표준 입력을 받아 실행시킨다는 것이다.

자세한 풀이는 아래 블로그를 참고!

https://nroses-taek.tistory.com/148

 

2. echo()

두 번째 풀이는 echo를 이용하여 특수문자를 출력하는 것이다.

쉽게 말하면 $(echo"\057")로 \을 표현하는 것이다.

 

실행 화면


1. read 사용

 

2. echo 사용