IMyoungho 2019. 4. 1. 23:30

이번 문제는 Mistake 풀다보니까 풀려버린문제다;;




우선 코드를 보도록 하자.

파란상자는 주어진값들과 입력받은 값을 XOR연산하는 함수가 정의된 내용이고

빨간상자는 이상하다고 느껴서 표시를 해두었다.



첫 번째 빨간상자를 보면 open을 기준으로 양쪽에 " = " 와 " < " 가 있다.

두 번째 빨간상자 역시 read를 기준으로 양쪽에 " = " 와 " > " 가 있다.



흠.. 여기서 힌트를 떠올려 보게 되었다.

operator priority ??? 연산자 우선순위?? 힌트를 통해 연산자 우선순위에

 대한 문제라고 예상할 수 있었다. 이 문제에서 중요한 것은 우선순위이다.



" 비교연산자가 대입연산자보다 우선순위가 높다!! " 



첫 번째 빨간상자의 if문을 보면 password파일이 저 경로에 있기 때문에

양수값을 반환하고 양수 < 0을 진행하면 당연히 거짓이다.

그러므로 fd에는 거짓이 들어가게되고 if문은 실행되지않을 것이다.



다음에 나오는 if문을 보자.

입력을 하는 부분인데 fd=0이고 pw_buf는 우리가 입력할 수 있는 공간이다.

PW_LEN은 10으로 선언되어 있다. 이 역시 read 함수가 실행되면 반환 값으로

입력한 바이트의 수를 반환할 것임으로 0보다 크다. 반환된 바이트 수 > 0은

참이므로 len의 값은 참인 1이 될 것이다. 참값에 !이므로 거짓이된다.

그러므로 두 번째 if문도 통과하게된다.



이제 우리가 입력할 수 있는 나머지 버퍼인 pw_buf2의 값들을 1과 XOR해서

나온 값이 이전에 입력한 pw_buf와 같으면 flag를 볼 수 있다.



나는 pw_buf에 "cccccccccc"를 넣고 그것을 XOR연산한 

값 "bbbbbbbbbb"을 pw_buf2에 넣어주었다.




Password OK라는 문자열과 같이 FLAG가 튀어나왔다~



반응형