zj3t

email: euntaejang@gmail.com

Latest Posts

pwnable.kr-lotto

By 오전 11:08 ,

이번에도 첫번째 섹션에 대한 문제입니다.
코드는 길지만 굉장히 단순한데 요점을 찾지못해서 해맸던 문제입니다.
(실력부족....)






코드는 대략 이런데 help()함수는 일부러 뺏습니다. 문제를 푸는데 아무 영향이 없는 함수이기 때문입니다.

여기서 핵심은 play() 함수입니다.

가만히 잘 들여다보면 /dev/urandom 에서 랜덤값을 가져와 대입을 하는 것을 볼 수가있는데요 저는 이 파일에 취약점이 있을거라 생각하고 제 리눅스로 코드를 복사해 돌려봤는데 랜덤한 값을 패턴을 찾을 수 가 없어서 해매던 중 

lotto[i] == submit[i] 을 비교해서 match를 +1 하는 부분!!!
그리고 이 match가 6이면 성공 플래그를 띄우도록 되어있는데요.

가만히 주목해야할 것이 submit[i]==lotto[i] 가 아니라는 점입니다.  

lotto는 랜덤한 값이 들어갑니다. 따라서 6개의 같은 값이 들어갈 가능성은 아주아주 굉장히 희박한데요 만약 submit에 111111을 넣어주고 lotto 배열에 1이 적어도 하나가 존재한다면 match는 6이 될 것입니다.

자 그렇다면 111111을 넣었을 때 여러번 시도하다 보면 성공이 될까요????

답은 아닙니다. 잘보면 우리가 입력하는 값은 char 이고 lotto 배열에 들어가는 값도 char 입니다. 하지만 %45 부분에서 1~45의 수를 구하는 부분은 10진수 입니다. 

즉 char을 10진수로 바꾼 값 % 45 의 값을 우리가 키보드로 입력이 가능해야한다는 점입니다.

따라서 만약 0,1,2,3,4,5,6,7,8,9 같은 값을 입력한다면 이는 문자 이므로 10진수로는 48~57이고 이를 %45+1한다면 4~13이 됩니다. 하지만 이 값은 우리가 키보드로 입력할 수 없는 값들입니다.(아스키 코드표 참조)

따라서 우리는 !,@,#,$,% 이러한 10진수로 33 부터 시작해서 45보다 작은 수를 넣어주어야 합니다. 

따라서 는 !을 선택해서 넣은 결과 대략 9번정도 끝에 답을 출력 할 수가 있었습니다.



You Might Also Like

0 개의 댓글