IMyoungho 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를 볼 수 있다.

반응형