9번은 연산자 우선순위가 힌트라는 걸 알아두고 실행해보았다.
ls 로 mistake.c 가 있는 것 확인 후 열어보면
가장 먼저 system(“/bin/cat flag\n”) 가 있는 곳에서 조건을 확인해보면,
pw_buf와 pw_buf2 를 비교해서 값이 같으면 플래그를 획득할 수 있는 것 같다.
그러나 pw_buf2 의 값을 1과 xor 연산하기 때문에 pw_buf2 를 1과 xor 연산한 후의 값과 pw_buf 값을 비교한다.
-> 1 xor (pw_buf2) 와 pw_buf 비교
바로 위를 보면 pw_buf2 는 scanf 를 통해 10바이트까지 입력받을 수 있는 것 같고,
pw_buf는
if(!(len=read(fd,pw_buf,PW_LEN) > 0))
에서 처리되는데, 앞선 풀이에서 정리했듯이 fd의 값에 따라 버퍼의 사용이 달라지므로
* read() : 수신, 입력받은 바이트의 수를 반환하거나 실패시 0을 반환
fd 가 있는 부분을 가보면,
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
여기에서도 연산자 우선순위 힌트를 적용해서 확인해볼 수 있을 것 같다.
언뜻보기에는 fd 값과 0을 비교하는 것 같지만 사실 < 연산자가 먼저 수행이 된 후 fd 에 = 을 통해 들어가기 때문에,
open("/home/mistake/password",O_RDONLY,0400) 가 정상 실행되어 0을 반환하고, 0 <0 결과인 false 가 fd 로 들어가 fd = 0 이 된다.
fd = 0 이면 표준입력이기 때문에 pw_buf 도 사용자로부터 입력받아 채워지게된다.
따라서 pw_buf 10바이트를 입력하고, 입력한 pw_buf 값에 xor 시킨 값을 pw_buf2 에 입력되도록 입력하면 풀릴 것이다.
flag 획득!
'WARGAME > pwnable.kr [system]' 카테고리의 다른 글
[Toddler's Bottle] 6번 random (0) | 2019.11.28 |
---|---|
[Toddler's Bottle] 4번 flag (0) | 2019.11.19 |
[Toddler's Bottle] 3번 bof (0) | 2019.11.19 |
[Toddler's Bottle] 2번 collision (0) | 2019.11.14 |
[Toddler's Bottle] 1번 fd (0) | 2019.11.14 |