본문 바로가기

Pwnable/pwnable.kr

[pwnable.kr] mistake 풀이

https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr


 

그림 1

 

문제를 살펴보니, 우리는 모두 실수를 하고, 엄청나게 멋진 해킹 스킬이 필요하지 않은 문제라고 한다.

힌트를 보니 연산자 우선순위라고 되어있는데, 일단 접속을 해보았다.

 

그림 2

앞부분은 다른 문제들이랑 똑같아서 스킵하고, 무슨 파일들이 있는지 살펴보았다.

일단 mistake 파일을 실행시켰더니 do not bruteforce…라고 나온다.

 

더 이상 확인할 수 있는 부분이 없어서 cat 명령어를 통해 mistake.c 파일을 열어보았다.

 

그림 3

맨 위부터 차례대로 보면, PW_LEN(10)과 XORKEY가 정의되어 있다.

그리고 xor이라는 함수가 있다.

 

메인을 위주로 보기 시작하면, if 문이 있는데, 위의 문제에서 말한 hint가 여기서 쓰인다.

연산자 우선순위에서 =는 제일 나중에 진행한다.

그러니까 fd=open() <0에서 open의 반환값이 fd에 들어가는 것이 아니라, 0과 비교해서 맞으면 1, 아니면 0이 fd에 저장되는 것이다.

open에서 password를 열고 있으므로, 당연히 0보다 큰 값이 들어가고, wrong이므로 fd에는 0이 저장된다.

 

내려가면 위에서 보았던 do not bruteforce가 보이고, sleep 함수가 보인다.

 

Pw_buf를 보면, len= read() > 0에서 연산자 우선순위가 또 쓰인다. read함수에서 성공하면 읽은 길이만큼을 len에 저장하고, read를 실패하면 read error를 출력한다. 그런데 위에서 fd가 0이었으므로, 사용자로부터 입력값을 받는 것을 알 수 있다.

 

이제 pw_bif2를 보면, input password:를 출력하고 pw_bif2에 저장되는 문자열을 입력받고 있다.

 

이어서 보면, xor 함수를 통해 i=0에서 9까지 pw_buf2의 문자열을 한 글자씩 가져와서 1과 xor 하고 있다.

 

XOR 함수가 끝나고 다시 메인함수로 돌아오면, pw_buf와 pw_buf2를 1과 xor 한 값이 같으면 flag를 보여주는 것을 알 수 있다.

 

xor함수는 다르면 1을 출력하므로, pw_buf와 pw_buf2(xor이 끝난 상태)를 반대로 입력해주면 flag를 얻을 수 있다.

 

그림 4

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

[pwnable.kr] lotto 풀이  (0) 2021.08.18
[pwnable.kr] leg 풀이  (0) 2021.07.29
[pwnable.kr] random 풀이  (0) 2021.07.29
[pwnable.kr] collision 풀이  (0) 2021.07.26
[pwnable.kr] fd 풀이  (0) 2021.07.11