본문 바로가기
Security/pwnable.kr

[pwnable.kr] Toddler's Bottle - lotto

by 단월໒꒱ 2021. 11. 28.

이번에 풀 문제는 lotto 문제이다.

 

 

 

 

다른 힌트는 없고 그냥 로또 게임을 만들었다고 한다.

적혀있는 명령어로 접속해준다.

 

 

 

 

접속 완료했다.

 

 

 

 

파일 리스트는 이 정도 있다는 것을 확인한 뒤 lotto.c 파일의 내용을 살펴봤다.

 

 

 

 

일단 main 함수 부분을 먼저 살펴본다.

메뉴를 선택하게끔 되어있다. 1을 입력하면 play(), 2를 입력하면 help(), 3을 입력하면 종료가 된다.

help() 내용은 대충 이 게임이 어떻게 진행되는 지 참고하는 용으로만 보고 play() 함수를 자세히 봐보자.

아직 뭔진 모르겠지만 match 값이 6이면 flag를 출력하도록 되어있다.

 

코드가 기니 play() 함수의 일부분은 따로 잘라서 살펴봤다.

 

 

 

 

read 함수 부분을 살펴보면 첫번째 매개변수에 0이 들어있으므로 표준 입력으로 6만큼 읽어온다고 되어있다.

 

밑의 open 함수를 보면 /dev/urandom을 읽는데 읽기 전용으로 연다고 되어있는데, 이는 random 값 생성을 위한 과정이다.

파일 열기를 성공한 경우 다음으로 넘어갈 수 있다.

 

 

 

 

파일 여는 데 성공했으면 read 함수로 6바이트의 unsigned char을 입력 받는다.

6바이트를 입력 받아야 read 함수로 반환된 값이 6이 되어 정상적으로 다음으로 넘어갈 수 있다.

여기서 unsigned char로 입력받기 때문에 아스키 코드 상에서 1~45 사이에 속하는 char 값을 넣어줘야 한다.

 

 

 

 

아래의 for문을 돌면서 입력한 값과 lotto에 저장된 값을 비교하는데 값이 같을 경우 match의 값이 하나씩 올라간다.

이렇게 match 값이 6이 되면 flag를 출력하게 된다.

 

 

코드 분석이 얼추 끝났으니 직접 값을 입력해보자.

 

 

 

 

아스키 코드 상에서 1~45 사이에 속하는 char값을 입력하도록 한다.

적당히 $$$$$$을 입력해주었는데 실패해도 random 값이 바뀌므로 계속 이 값을 넣어주도록 한다.

 

 

 

 

계속 넣다보면 위의 화면처럼 성공할 수 있다. 성공할 시 이렇게 flag가 출력된다.

 

 

 

 

출력된 flag의 내용을 넣어주면 

 

 

 

 

이렇게 문제를 해결했다고 뜬다.

 

 

댓글