본문 바로가기
Pwnable/Pwnable CTF

[Pwnable.kr] Toddler's Bottle_mistake

by Y06 2021. 4. 27.

mistake 문제를 보았다. 힌트를 보니 operator priority라고 적혀 있다.

즉, 우선순위 문제이다.

문제에 있는 ssh에 접속한 후, 코드를 보자. 

ls -l 명령어를 통해 어떤 파일이 있는지 확인하였다. mistake.c 파일을 먼저 확인해보자.

mistake 문제의 mistake.c 파일

[ 조건의 우선순위 ]

비교 연산자는 산술 연산자보다 우선순위가 높다.

결국, ' < '를 먼저 계산하고 ' = '를 그 다음에 계산하라는 의미이다.

 

' < '를 먼저 계산했을 때, password에 들어있는 것은 0보다 클 것이므로 false가 되고 이는 결국 ' = '로 인해 int fd 안에 들어간다.

결론적으로 fd는 0이 되고 위의 if는 실행되지 않는다.

 

1. open("/home/mistake/password", O_RDONLY, 0400) < 0

2. 1번의 결과를 fd 결과에 저장한다.

open() < 0의 결과는 0이다. fd 값도 0이 된다.

 

read 함수 첫 번째 인자에 0이 들어갈 경우, 표준 데이터를 입력받게 된다.

앞서 fd는 0이었으므로 표준 데이터를 입력 받는다.

 

결국, 사용자가 pw_buf 안에 데이터를 입력하게 되고 사용자가 넣은 값이 답이 된다.

 

pw_buf를 입력하면 패스워드를 입력하라고 뜬다.

이때 방금 입력한 값과 동일하게 입력하면 안 된다.

 

패스워드가 들어가는 pw_buf2는 XOR 된 후에 pw_buf와 비교되기 때문이다.

그러므로 XOR을 고려해서 10자리 데이터들을 넣어준다.

 

scanf를 통해 pw_buf2의 값을 입력받기 때문에 pw_buf, pw_buf2 모두 우리가 설정할 수 있다.

그 뒤에 pw_buf2를 1과 XOR한 값과 pw_buf가 같으면 플래그를 준다.

 

1111111111을 넣고 XOR 한 값인 0000000000을 넣었더니 FLAG 값이 나왔다.

 

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