Pwnable.kr Mistake 문제로 7개월만에 복귀했습니다. 코로나 때문에 못 나가서 미치겠네요.. 다들 화이팅 합시다

귀여운 원숭이 일러스트

문제에 힌트도 있고 뭐라 말이 많네요?

CTF에 참가해보면서 대부분은 문제에서 50%는 먹고 들어가야한다는것을 깨닳았기 때문에 한번 해석해봅시다.

 

This task is based on real event - 실제 일에 기반을 뒀다고 하네요? 

Thanks to dhmonkey - dhmonkey라는 사람에게 감사한다고 합니다.

 

쓸데없는 부분이였고 힌트를 봅시다

hint : operator priority - 운영자 우선 순위라는 뜻입니다. 직역이 그렇고 연산자 우선 순위를 의미하는것 같네요.

 

접속을 해서 코드를 열어보겠습니다.

평소와 같이 C코드네요. 그럼 이 문제를 풀기 위해선 C의 연산자 우선 순위에 대해서 알아야 할 것 같습니다.

 

이 문제를 풀기 위해서 알아보니 비교 연산자가 산술 연산자보다 우선순위가 높기 때문에 먼저 처리된다는 것을 알아두면 되겠네요.

 

if(fd=open("/home/mistake/password",O_RDONLY,0400 < 0)

이 부분에서는 open 함수의 반환값인 fd를 0과 비교하는것 처럼 볼 수 있습니다. 하지만 < 의 연산자 순위가 = 연산자 보다 우선순위가 높기 때문에 open함수의 값과 0을 먼저 비교한 다음 그 값이 fd에 들어가는 것 입니다.

 

그러므로 0과 비교했을때 false 이니 fd 에는 0이 들어가게 됩니다. 

 

뒤에도 비슷한 부분이 많습니다

 

if(!(len=read(fd,pw_buf,PW_LEN) > 0))

위에서 fd에 0이 들어갔음을 알수 있고, read 함수에서  fd = 0 이면 stdin이고 그렇게 되면 직접 입력값을 받기 때문에 그 입력값이 pw_buf에 들어가면서 pw_buf의 값을 맘대로 설정해서 문제를 풀면 됩니다.

 

scanf("%10s",pw_buf2);

 이 부분을 통해 pw_buf2 값을 받기 때문에 pw_buf, pw_buf2 두 부분다 맘대로 설정할 수 있습니다. 

pw_buf2를 1과 xor한값과 pw_buf가 같으면 익스가 성공합니다!

엄마, 연산자 우선순위는 항상 저를 헷갈리게해요 :(

 익스가 됬네요!

 

FLAG : Mommy, the operator priority alwalys confuses me :(

반응형
복사했습니다!