-
[Pwnkr] Black Jack Write-up표튜터와 함께하는 Pwnable/Pwnable.kr Write-up 2019. 4. 15. 16:23
이번 문제는 Black Jack이다.
힌트를 보았더니 돈이 그냥 많으면 준단다. 백만장자한테 준다는데..
코드를 보도록 하자.
음... 길다... 길어서 다 보여주기 힘들다.
문제에 링크가 있으니 참고하길 바란다.
일단 프로그램을 실행해보도록 하겠다.
블랙잭 게임이 뭔지는 잘모르지만 돈을 배팅하고
배팅한 돈의 일정한 비율로 돈을 따는 게임인 것 같다.
백만장자한테 FLAG를 준다고 했으니 돈에 관련된
코드에 분명히 취약점이 있을 것 같았다.
그래서 우선적으로 눈에보이는 Bet에 대해서 검색을 해보았다.
이 함수가 바로 배팅관련 함수이다. 이름이 그냥 betting( ) !!
우리가 배팅하고 싶은 금액을 입력할 수가 있다. 하지만 현재 가지고 있는
cash보다 배팅 금액이 클 경우 너는 가진돈보다 많은 돈을 배팅했다며
메시지를 출력하는데 그 다음 또다시 입력을 받고 바로 bet을 return해버린다.
그 외의 경우에는 그냥 bet을 return한다.
그러므로 그냥 큰 값을 입력해버리면 될 것이다.
리턴된 bet값은 승리 시에 cash에 +되고 패배 시에는 -된다.
이제 위에서 생각한대로 한번 진행해보도록 하겠다.
7을 그냥 있는대로 넣었다ㅎㅎ
Hit 할래? Stay 할래?라고 물었다. 당연히 H~~~
Hit는 카드를 더 받는것이고 Stay는 안받는다는 의미라고한다.
더 줘라고 했더니 오잉? 이겨부렸다~~
돈이 나에게 돌아왔는데 거금이 들어왔고 나는 백만장자가 되었다.
덤으로 FLAG값도 주었다~~
이번에는 패배해보았다~ bet의 자료형(int) 범위보다 큰 수를 넣었더니
if문이 그냥 생략되었다. 하지만 뭐 그 외의 경우도
bet를 return하기 때문에 경고문 출력없이 진행되었고
(이 부분은 범위보다 작으면 무조건 출력하지만 클 경우에는
출력할 때도 있고 안할 때도 있었음)
역시 돈과 FLAG를 준다~~
(참고로 음수 값을 채워넣어도 가능하다.
그 이유는 첫 번째로 수식에 있는데 패배할 경우
bet에 - 되므로 --가 되어 +가 된다. 두 번째 이유는
범위가 커질 때 발생한다.
int 형의 최소값인 -2147483648에 -1을 하게되면 2147483647이 된다.
이러한 현상을 언더플로우 (반대는 오버플로우)라고 하는데 이를 이용함으로써
음수를 사용해서 승리하게 되더라도 FLAG를 볼 수 있다.
반응형'표튜터와 함께하는 Pwnable > Pwnable.kr Write-up' 카테고리의 다른 글
[Pwnkr] Input2 Write-up (0) 2019.04.17 [Pwnkr] Blukat Write-up (0) 2019.04.15 [Pwnkr] Cmd1 Write-up (0) 2019.04.04 [Pwnkr] Lotto Write-up (0) 2019.04.03 [Pwnkr] Leg Write-up (0) 2019.04.02 댓글