pwnable Toddler`s Bottle - mistake
문제파악
코드가 꽤 길지만 내용은 파일로 부터 읽어온 값과 입력값이 일치하면 flag값을 확인할 수 있다는 것을 볼 수 있다. hint로 operator priority
가 주어진 만큼 이를 중점으로 생각하면 될 것이다.
operator priority
코드를 보면 웬지 괄호를 치고 싶어지는 부분이 있다.
위의 코드를 보면 =, <,> 연산자들이 괄호로 구분되지 않은채 사용되고 있다. C언어의 연산자 우선순위를 우선 살펴보자
위의 우선순위를 살펴보면 관계 연산자가 할당 연산자 보다 높은 우선순위
를 갖는다는 것을 확인할 수 있다. 이에 따르면 open 함수의 결과값이 fd 변수에 저장되는 것이 아니라 비교연산의 결과가 저장되어 0이 저장되게 된다.
표준 입출력이 0(stdin), 1(stdout), 2(stderr)를 이미 선점하기 때문에 파일 디스크립터는 3부터 시작하게 되기에 비교연산의 결과값은 무조건 0이 된다.
fd가 0이 된다면 이를 통해서 값을 읽는다는 것은 표준 입력에서 입력 받는 것과 같은 것이 된다. 따라서 pw_buf값을 임의로 줄 수 있게 된다.
xor
xor 함수를 이제 살펴보면 XORKEY인 1값과 xor 연산을 수행하여 저장하는데 이는 2진수의 제일 작은 자리수의 값을 반전시키는 결과값을 저장한다.
결론
결국 비교하는 두 개의 값을 임의로 설정할 수 있기 때문에 1의 자리수 값을 반전시킨 값을 넣어주면 flag를 읽을 수 있게 된다.
댓글남기기