System&Write up/Pwnable.kr

[pwnable.kr] Toddler's Bottle - mistake

Jubil 2017. 12. 17. 14:43
반응형

[pwnable.kr] Toddler’s Bottle – mistake

 


 


 

힌트는 연산자 우선순위입니다!

 



 

코드입니다. password 파일에서 10byte만큼 password를 읽고, pw_buf에 넣습니다.

scanf10byte만큼 사용자의 입력을 받고, pw_buf2에 넣습니다.

pw_buf21xor합니다.

pw_bufpw_buf2를 비교해서 같으면 flag를 출력합니다. 여기서도 마찬가지로 사용자의 입력은 char형이므로 ASCII 값이 들어간다는 것을 생각해줘야 합니다.

 

 

연산자 우선순위에 무슨 문제가 있나? 하고 봤습니다.


 


 

이 두 부분은 개발자가 의도한 흐름대로 움직이지 않습니다. 왜냐하면 연산자 우선순위때문입니다.

 

분명 open(), read()의 반환 값을 fd, len에 넣고, 그 값을 0보다 작은 지, 큰 지 비교하려는 의도였을 것입니다.

 


 

그래서 fd에는 password 파일의 file descriptor가 들어가야 하는데, < 0 과 비교한 값이 들어갑니다.

password 파일은 잘 있기 때문에 비교하면 0이 반환되고 즉, fd에는 0, stdin이 들어가게 됩니다.

 

len도 마찬가지로 수신한 byte 수가 반환되어 > 0과 비교하고, 그 결과값인 1이 다시 !연산자로 반전돼서 0이 되고, if문을 통과합니다.

 

결국 사용자 입력을 2번 받고(fd0, stdin이라서), 첫 번째 입력을 pw_buf, 두 번째 입력을 pw_buf2에 넣고 1xor를 한 후, 같으면 됩니다.

 

pw_bufBBBBBBBBBB를 넣고, 1xor한 값인 CCCCCCCCCCpw_buf2에 넣도록 하겠습니다.

 


B(66), C(67)

 

 


반응형