본문 바로가기

Pwnable/pwnable.kr

[pwnable.kr] lotto 풀이

https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr


그림 1

문제를 보니 “엄마, 학교에서 숙제로 로또 프로그램 만들었는데 해볼래?” 라고 한다.

뭔 말인가 했더니 다 풀고 이해가 됐다.

 

일단 kali에서 ssh로 접속해주었다.

 

그림 2

ls -l 명령어를 통해 확인해보았더니 fla, lotto, lotto.c 파일이 존재했다.

 

그림 3

Flag 파일은 당연히 안 열리고, lotto를 실행시켜서 play lotto를 했더니 6글자를 입력하라고 하길래 아무 숫자나 입력했더니 운이 안좋다고 한다.

 

Lotto 실행파일의 구조를 확인하기 위해 lotto.c 파일을 확인해주었다.

 

lotto.c _main func

코드가 엄청 긴 것 같은데 사실 중요한 내용은 그렇게 많지 않다.

 

일단 맨 아래에 main 함수를 확인해보니 1번을 누르면 play() 함수를 호출한다고 한다.

 

바로 아래의 play 함수를 확인해보았다.

lotto.c _play func

일단 처음부분의 fflush는 스트림을 비운다는 뜻이라고 한다.

 

그리고 6글자를 받아서 문자열 submit 배열에 저장한다.

 

/dev/urandom가 뭔지 몰라서 찾아보니 유닉스 계열 운영체제에서 유사 난수 발생기의 역할을 수행하는 특수 파일이라고 한다.

 

중요한 부분은 아래라서 위의 오류메세지 출력 부분들은 넘어갔다.

 

그리고 읽어온 값들을 1~45로 맞추기 위해서 for문을 이용하고 있다.

 

아래의 //calculate lotto score를 확인해보겠다.

 

I = 0~5, j=0~5 까지 수행하는데, lotto[i] = submit[j] 이면 match를 증가시킨다고 한다. 즉, /dev/urandom/을 통해 만들어진 난수와 입력 값의 6글자가 같으면 match가 1씩 증가한다는 것을 뜻한다.

 

이때, 중복되는 값에 대한 부분은 찾아볼 수 없는데, 다시 말해서 lotto[i]에서의 한글자가 submit[j]에서 j가 0~5일때까지 6번 동일하다면 match 값이 6이 되어 flag가 출력된다.

 

이제 1~45사이의 아무 문자열을 6번 입력하면 될 것이다.

 

아스키 코드표

 즉, 위의 표에서 10진수 45까지의 값 중에서 선택해야 하므로 나는 &값을 입력해보았다.

 

 

입력하다 보니 운 좋게 두 번 만에 맞았다!

 

FLAG : sorry mom… I FORGOT to check duplicate numbers… :(

 

뭔가,,, urandom 값을 정하는 모듈을 분석해야 하나 했더니 전혀 예상하지 못한 방식으로 답이 나와서 이상 + 신기,,,,

'Pwnable > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] mistake 풀이  (0) 2021.07.29
[pwnable.kr] leg 풀이  (0) 2021.07.29
[pwnable.kr] random 풀이  (0) 2021.07.29
[pwnable.kr] collision 풀이  (0) 2021.07.26
[pwnable.kr] fd 풀이  (0) 2021.07.11