Pwnable.kr 사이트에 hint가 주어져있다.
operaort priority 즉 연산자 우선순위를 생각해야하는 문제인 것 같다.
연산자 우선순위를 배운게 무려 이년전이라 흠칫
ls 명령어로 디렉토리에 있는 파일을 확인해보니
flag, mistake 실행파일 mistake.c 소스코드, password
password 파일이 어떤 역할을 하는지 궁금했으나
cat으로 읽을 수 있는 파일은 아니었고, 우선 읽을 수 있는 mistake.c 파일을 읽어보았다.
먼저 void 형의 xor 함수와 main 함수가 선언되어있다.
main 함수의 내용을 보면 password 파일의 내용을 pw_len만큼 읽어와 pw_buf 리스트에 저장한다.
이후 scanf() 함수로 입력 값을 pw_buf2에 저장하여 두 값을 비교한다.
두 값이 일치할 경우 "Password OK"를 출력하고 flag 값을 출력하는 system() 함수를실행한다.
xor 함수를 통해서는 string 형으로 받은 인자와 len 값을 활용하여
len의 길이만큼 반복문을 돌며 string 문자를 XORKEY 값과 xor 연산을 해준다.
전체적인 내용은 위와 같지만 HINT에 있던 연산자 우선순위에 집중해서 보자면
부분을 보면 < 보다 = 의 우선순위가 높기 때문에
fd 값에 open 함수의 리턴값을 먼저 대입하는 것이 아니라 0과 먼저 비교하게 된다.
이상이 없는 파일의 디스크립터 값은 양수를 반환하기 때문에 항상 왼쪽 값이 크게되고
false가 되어 fd에는 항상 0이 대입된다.
(fd = open("/home/mistake/password",O_RDONLY,0400)) < 0
으로 작성해야 원하던 동작을 할 수 있을 것이다.
그런 관점에서 이 부분을 다시 보면 fd에는 0이 들어가므로 stdin이고
내가 원하는 값을 pw_buf에 10byte 만큼 넣을 수 있게 된다.
read 함수로 읽어온 값인 pw_buf와 내가 입력하는 값인 pw_buf2의 값을 비교하게 되므로
xor 한 pw_buf2 [입력값]과 pw_buf1의 값이 일치하면 되는 것이다.
프로그램을 실행해보면 "do not bruteforce..."를 출력하고 아무 변동이 없고,
엔터를 눌러줘야 "input password: " 값을 출력하여 입력을 받게 된다.
이때 바로 엔터를 누르지 않고 임의의 값을 입력한 후에 넘어갈 수도 있다.
flag 값을 얻기 위해서는 mistake를 실행시키고 처음에는 1111111111을 입력하고
두번째 input password에는 위의 값과 xor 된 값인 0000000000을 입력하면 된다.
Mommy, the operator priority always confuses me :(
끝 !