[pwnable.kr] Toddler’s Bottle – mistake
힌트는 연산자 우선순위입니다!
코드입니다. password 파일에서 10byte만큼 password를 읽고, pw_buf에 넣습니다.
scanf로 10byte만큼 사용자의 입력을 받고, pw_buf2에 넣습니다.
pw_buf2를 1로 xor합니다.
pw_buf와 pw_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번 받고(fd가 0, stdin이라서), 첫 번째 입력을 pw_buf에, 두 번째 입력을 pw_buf2에 넣고 1과 xor를 한 후, 같으면 됩니다.
pw_buf에 BBBBBBBBBB를 넣고, 1로 xor한 값인 CCCCCCCCCC를 pw_buf2에 넣도록 하겠습니다.
B(66), C(67)
'System&Write up > Pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Toddler's Bottle - cmd2 (0) | 2017.12.30 |
---|---|
[pwnable.kr] Toddler's Bottle - shellshock (0) | 2017.12.17 |
[pwnable.kr] Toddler's Bottle - cmd1 (0) | 2017.12.17 |
[pwnable.kr] Toddler's Bottle - lotto (1) | 2017.12.15 |
[pwnable.kr] Toddler's Bottle - blackjack (0) | 2017.12.15 |