[pwnable.kr] 13번_lotto 풀이
포너블 13번 lotto 문제를 풀어볼 것이다.
숙제로 로또 프로그램을 만들었다고한다.
서버에 접속을 시도하였다.
우선 lotto 파일을 실행시켜보았다.
일단 프로그램의 룰을 알기 위해 2를 입력하였다.
nlotto는 46보다 작은 6개의 랜덤 자연수로 구성된다.
당신의 목표는 당신이 할 수 있는만큼 로또 번호를 매치시키는 것입니다.
만약 1위 복권에 당첨이 된다면 보상을 받을 수 있습니다.
더 자세한 내용은 아래 링크를 참조하십시오.
위 설명처럼 46보다 작은 6개의 자연수를 맞춰야한다. 아무 수나 입력하면 다른 메시지가 뜨기 때문에
lotto.c 코드를 분석하였다.
flag를 얻기 위해서는 로또 결과값에 따라 flag를 볼 수 있는 권한을 주는 play함수를 중요하게 봐야하는 것 같다.
fflush(stdout) 이라는 부분이 있는데 찾아보니 출력 버퍼 안에 존재하는 데이터를 비우는 즉시 출력하는 것이라고 한다.
flag를 얻기 위해서는 match 값이 6이 되어야만 한다.
로또 숫자를 비교하는 파트를 보면 6번 씩 6번 중첩으로 반복문을 돌려 총 36번 돌게 된다.
lotto[0]==submit[0~5]가 되서 만약 11111을 입력하고 lotto[] 중에 1이 있을 경우 match 값이 6이 되어 쉘을 얻는다.
lotto의 한 개만 알아내면 된다.
lotto 1~32까지의 아스키코드 값은 보통 사용을 안하기 때문에 !부터 된다.
입력할 때 보면 자료형이 int형이 아닌 char형으로 받아서 1을 입력하면 '1'로 인식되어 10진수값으로 49가 된다.
45 이하가 되는 문자를 입력해야 하고 키보드로 입력 가능한 문자는 몇 개 되지 않기 때문에
이를 이용하면 쉽게 flag를 찾을 수 있을 것이다.
!표를 6개하면 된다.
sorry mom... I FORGOT to check duplicate numbers... :(
sorry mom... I FORGOT to check duplicate numbers... :(