본문 바로가기
Security/pwnable.kr

[pwnable.kr] Toddler's Bottle - blackjack

by 단월໒꒱ 2021. 12. 5.

이번에는 blackjack 문제를 풀어보았다.

 

 

 

 

문제를 보니 백만장자가 되면 flag를 주겠다는 것 같다. 

nc pwnable.kr 9009를 통해 접속해보았다.

 

 

 

 

 

 

이렇게 3가지 메뉴가 뜨는데 백만장자가 되기 위해서는 게임을 해야하니 1을 선택해준다.

 

 

 

 

1을 선택하면 위와 같은 화면이 뜨는데 어떻게 진행해야 할 지 잘 몰라서 문제에 적혀있는 사이트를 통해 blackjack 게임의 코드를 살펴보기로 했다.

 

대충 21에 가까운 수를 얻어야 이기는 게임인 것 같은데 cash가 500인 상황에서부터 1000000까지 가려면 굉장히 많은 과정을 거쳐야 하니 무엇인가 꼼수를 부릴만한 것이 있는 지 살펴보았다.

 

여러가지 함수들과 함게 코드가 굉장히 길었는데 1번 메뉴를 선택시 play() 함수를 실행하는 것으로 보아 일단 play 함수를 확인해보았다.

 

 

 

 

코드가 굉장히 긴데, 이 중에서 이용할만한 부분을 뽑아보니 아래의 두 가지였다.

 

 

첫번째는 이 부분이다.

 

 

 

사용자가 배팅한 bet 값과 사용자가 보유한 cash 값을 비교하여 bet가 더 클 경우 다시 금액을 배팅하도록 되어있는데, 이 부분에서 cash 값과 비교하는 과정 없이 바로 bet 값이 리턴된다.

즉, 두번째 배팅 땐 bet 값이 cash 값보다 커도 그대로 bet 값이 유지되므로 여기서 1000000을 입력해줄 수 있는 것이다.

 

 

두번째는 이 부분이다.

 

 

 

이 부분이 짧아서 가져오긴 했지만 p가 21보다 작거나 같을 경우에 딜러의 총합이 21일 때에도 해당되는 내용이다.

즉, 사용자가 지는 경우에 해당하는 내용이다.

질 경우 보유한 cash 값에서 배팅한 bet 값을 빼는데 여기서 bet 값에 음수를 주면 cash 값에 + 되므로 bet에 -1000000을 입력해주고 게임에서 졌을 때 cash 값에 +1000000 된다는 의미이다.

 

 

위의 두 가지 경우를 각각 이용하여 게임을 통해 1000000달러를 따보았다.

 

 

1) 첫번째 부분 이용

 

 

 

첫번째 배팅 때 cash 보다 큰 값을 넣어서 두번째 배팅으로 넘어가 똑같이 cash보다 큰 1000000을 입력한 경우이다.

 

 

2) 두번째 부분 이용

 

 

 

음수, 그러니까 -1000000을 입력한 경우이다.

 

 

두 경우 모두에서 무사히 1000000달러를 따서 flag를 얻을 수 있었다.

 

 

 

 

위에서 얻은 flag 내용을 넣어주면

 

 

 

 

문제를 클리어했다는 창을 볼 수 있다.

 

 

댓글