본문 바로가기

WARGAME/pwnable.kr [system]

[Toddler's Bottle] 9번 mistake

 

9. mistake

9번은 연산자 우선순위가 힌트라는 걸 알아두고 실행해보았다.

 

ls 로 mistake.c 가 있는 것 확인 후 열어보면

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

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