문제를 보니 “엄마, 학교에서 숙제로 로또 프로그램 만들었는데 해볼래?” 라고 한다.
뭔 말인가 했더니 다 풀고 이해가 됐다.
일단 kali에서 ssh로 접속해주었다.
ls -l 명령어를 통해 확인해보았더니 fla, lotto, lotto.c 파일이 존재했다.
Flag 파일은 당연히 안 열리고, lotto를 실행시켜서 play lotto를 했더니 6글자를 입력하라고 하길래 아무 숫자나 입력했더니 운이 안좋다고 한다.
Lotto 실행파일의 구조를 확인하기 위해 lotto.c 파일을 확인해주었다.
코드가 엄청 긴 것 같은데 사실 중요한 내용은 그렇게 많지 않다.
일단 맨 아래에 main 함수를 확인해보니 1번을 누르면 play() 함수를 호출한다고 한다.
바로 아래의 play 함수를 확인해보았다.
일단 처음부분의 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 |