문제를 살펴보니, 우리는 모두 실수를 하고, 엄청나게 멋진 해킹 스킬이 필요하지 않은 문제라고 한다.
힌트를 보니 연산자 우선순위라고 되어있는데, 일단 접속을 해보았다.
앞부분은 다른 문제들이랑 똑같아서 스킵하고, 무슨 파일들이 있는지 살펴보았다.
일단 mistake 파일을 실행시켰더니 do not bruteforce…라고 나온다.
더 이상 확인할 수 있는 부분이 없어서 cat 명령어를 통해 mistake.c 파일을 열어보았다.
맨 위부터 차례대로 보면, 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를 얻을 수 있다.
'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 |