본문 바로가기
Pwnable/Pwnable CTF

[Pwnable.kr] Toddler's Bottle_lotto

by Y06 2021. 5. 11.

문제에 처음 들어가면 보이는 부분이다. ssh를 이용하여 접속한다.

ssh를 이용하여 접속한다.

디렉토리에 어떤 파일이 있는지 확인한다.

우리가 공격해야 할 대상인 lotto와 lotto elf 파일을 만들었을 소스로 예상되는 lotto.c와 flag가 존재한다.

현재 flag는 id(lotto)의 권한으로 볼 수 없고, lotto elf 파일은 lotto_pwn의 권한으로 setuid가 설정되어있다.

 

lotto elf를 실행함으로써, setuid를 얻고 flag를 볼 수 있을 것으로 예상된다.

 

lotto.c 파일을 분석하자. main 함수는 사용자로부터 메뉴를 입력받아 play 함수, helo 함수, 종료. exception handlding을 진행한다. help(), 종료, exception handling은 문제가 될만한 것이 없었다.

play 함수를 중심적으로 보면 4바이트 정수형을 하나 선언하고 "Submit your 6 lotto byte: "를 입력하고 output stream을 비운다.

4바이트 정수형 자료형을 하나 선언하고, input stream으로부터 6글자를 받아 char형 array submit에 저장한다.

"Lotto Start!"를 출력한다.

 

이러한 방식으로 소스코드를 보았을 때 lotto와 submit array를 비교하는데 있어서 사용자의 입력을 중복 체크하지 않아서 우리는 높은 확률로 lotto에 당첨될 수 있다.

1~45 사이의 아스키 코드를 입력하면 높은 확률로 성공 가능하다. lotto로 선정된 6개의 바이트에 +가 있다고 가정하고 공격을 진행한다.

 

flag가 출력되었다.

 

FLAG: sorry mom... I FORGOT to check duplicate number... :(