본문 바로가기
포너블(pwnable)/CTF(pwnable.kr)

[Toddler's Bottle] mistake 문제풀이

by LIZ0904 2021. 4. 28.
반응형

[Toddler's Bottle]

오늘의 문제

오늘의 문제는 ssh 주소 하나가 있고, operator priority(연산자 우선순위) 라는 hint가 주어졌다.

 

ssh

ssh 주소를 입력해 문제에 접속했다.

 

ls -l

ls -l 명령을 사용해 현재 위치에 있는 모든 파일을 확인해주었다. flag, mistake, mistake.c, password 총 4개의 파일이 있다.

 

 

cat mistake.c

cat mistake.c 명령을 통해 mistake.c 파일의 내용을 확인해보았다. xor 함수와 main함수로 이루어져 있다. 우선 main함수부터 살펴보자!

 

 

	int fd;
	if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
		printf("can't open password %d\n", fd);
		return 0;
	}

	printf("do not bruteforce...\n");
	sleep(time(0)%20);

첫번째 if문에서, open 함수의 반환값인 fd와 0을 비교하는 것 같지만 이는 틀렸다. 힌트에서 말했듯이 연산자 우선순위를 확인해보면, 비교연산자(<)가 산술연산자(=)보다 우선순위가 높다는 사실을 기억해야한다. 즉, fd의 값과 0을 비교하는 것이 아닌, open함수의 반환값과 0을 비교한 뒤, 이를 fd에 넣어주는 것이다.

위 코드가 실행될 때, open 함수에서 파일이 정상적으로 열리게 되므로 양수를 반환하게 되며, 0보다 작지 않기 때문에 fd 값은 false를 의미하는 0이 들어가게 된다.

그 후 "do not bruteforce...\n" 메세지가 출력되고 sleep 함수가 실행된다.

 

 

char pw_buf[PW_LEN+1];
	int len;
	if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
		printf("read error\n");
		close(fd);
		return 0;		
	}

두번째 if문도 마찬가지다. 현재 fd에 0이 들어가 있는 상태인데, fd=0이면 stdin을 의미한다. 즉, 사용자로부터 입력값을 받는다. 이 입력값은 pw_buf에 들어가게 되고, 정상적으로 들어가기만 하면 두번째 if문은 통과다.

 

 

	char pw_buf2[PW_LEN+1];
	printf("input password : ");
	scanf("%10s", pw_buf2);

그 다음 scanf를 통해 pw_buf2 값을 입력한다.

.

 

	// xor your input
	xor(pw_buf2, 10);

	if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
		printf("Password OK\n");
		system("/bin/cat flag\n");
	}
	else{
		printf("Wrong Password\n");
	}

	close(fd);
	return 0;

 

그 다음, xor 함수를 실행한다. 세번째 if문에서, pw_buf의 내용과 pw_buf2의 내용이 같은지 확인한다. 같으면 if문이 실행되면서 flag 파일을 열람할 수 있게 된다. pw_buf와 pw_buf2 모두 우리가 설정할 수 있고, PW_LEN = 10이다. pw_buf와 pw_buf2를 xor한 값이 같기만 하면 된다!

 

 

#define XORKEY 1

void xor(char* s, int len){
	int i;
	for(i=0; i<len; i++){
		s[i] ^= XORKEY;
	}
}

xor 함수를 확인해보면, 주어진 크기만큼의 배열에 1을 집어넣는다. ^는 xor 연산을 의미한다.

 

 

정답 입력

그냥 pw_buf와 pw_buf2 둘 중 하나에는 0만, 하나에는 1만 집어넣으면 xor 연산이 맞기 때문에 간단하게 문제가 끝난다.

 

 

정답!

flag를 입력해주면 정답!!

 

 

flag: Mommy, the operator priority always confuses me :(

반응형

댓글