IT(개발, 보안)/pwnable

[Pwnable 풀이] 12. mistake

인도호랑이 2022. 12. 6. 09:14

이번 문제는 꽤나 간단하지만 힌트가 없었다면 다소 고전했을 것 같은 문제이다. 문제에서 operator priority가 주어졌는데 이를 유의하고 문제를 풀어보자.

 

먼저 접속 후에 디렉토리를 살펴보면 mistake 실행파일과 그 코드로 의심되는 소스코드 파일, flag와 password 파일이 있다. 현재 id는 mistake 이므로 flag와 password 파일은 열람하지 못하기 때문에 소스코드 파일을 먼저 살펴본다.

 

xor함수와 main 함수로 구성되어 있는 소스코드 파일을 확인할 수 있다.

 

xor 함수에서는 인자로 받은 문자열을 xor 시켜주는 역할을 수행하고

 

main 함수에서는 password 파일을 fd로 open()하고, 파일 속 내용을 pw_buf로 read()하여서 입력 받은 pw_buf2를 xor 시킨 결과와 비교하는 기능을 수행한다.

 

힌트가 operator priority 라는 것을 읽기 전까지는 나도 무슨 문제가 존재하는지 알 수 없었지만 코드 속 operator 들을 찬찬히 살펴보고 나서 무언가 잘못된 점을 찾을 수 있었다. 만약 한번에 찾을 수 있다면 당신,,, 대단한걸?

 

코드 개발자가 저지른 실수는 main 함수의 첫번째 if 구문이다. = 연산자와 < 연산자 중 < 연산자가 더 높은 우선순위를 갖고 있기 때문에, open 함수는 1 이상의 fd를 return 해서 open( ~ ) < 0 구절은 False, 0의 값을 갖게 되고 fd에는 0의 값이 저장된다.

 

이는 이 후 fd를 사용하는 구절에서 매우 심각한 취약점을 야기하는데 이는 아래와 같다.

개발자가 소스코드를 작성한 의도대로라면 fd는 password 파일을 가르키겠지만 fd의 값은 0, 즉 표준 입력(stdin)을 가르키고 있으므로 위의 read 함수는 표준입력에서 PW_LEN 만큼의 문자열을 pw_buf에 저장하는 결과를 야기한다.

 

때문에 결국 위의 if문에서 비교되어지는 pw_buf의 문자열은 password 파일에 저장된 값이 아닌 클라이언트로부터 받은 입력값을 pw_buf2의 값과 비교하게 된다.

 

그러므로, 해당 if 문을 통과하기 위해서는 입력값으로 XOR할 때 같은 입력값을 pw_buf1과 pw_buf2에 입력하게 되면 flag값을 얻을 수 있다.

반응형