0x02 Study :)/Pwnable

[pwnable.kr][Toddler] blackjack 문제풀이

eli_ez3r 2018. 8. 18. 17:55

blackjack

문제를 푸는 시간보다 blackjack 게임에 대해 이해하는게 더 어려웠던 문제....😒



nc로 접속해 보면 위 처럼 보여지는데, 1번을 누르면 게임이 시작되고, 2번은 게임 설명이다.

 


블랙잭에 대해 몰라서 2번을 눌러 설명을 보기로 했다.(사실 이걸 읽고도 이해하지 못해서 블랙잭을 아는 지인한테 물어봐서 겨우 이해했다... 제대로 이해 했는지는 모르겠지만😂)

블랙잭은 나와 딜러 2명이서 진행하는 게임이다.

처음 서로 1장씩 가지게 되고 베팅을 하게 된다.

그리고 각 라운드마다 'Hit'과 'Stay'중 선택을 할 수있다.

각 라운드마다 받은 카드 숫자의 합이 21과 더 가까운 사람이 승리하게 되며, 21을 넘어서면 패배가 된다.

그리고 21이 되면 무조건 승리하게 된다.

대충 블랙잭은 이렇게 흘러가게 된다.

 

http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html

주소로 들어가보면 소스코드가 존재한다.

소스코드가 상당히 길기 때문에 중요부분만 살펴보면....

int betting() //Asks user amount to bet
{
 printf("\n\nEnter Bet: $");
 scanf("%d", &bet);
 
 if (bet > cash) //If player tries to bet more money than player has
 {
        printf("\nYou cannot bet more money than you have.");
        printf("\nEnter Bet: ");
        scanf("%d", &bet);
        return bet;
 }
 else return bet;
} // End Function

베팅 부분이다. 처음 게임을 시작하면 $500로 시작하게 되고, 카드를 1장을 받고나서 베팅를 하게 된다.

이때 베팅한 값이 bet변수에 들어가게 된다.

함수를 살펴보면 사용자가 입력한 bet값이 자신이 가지고 있는 값보다 크면 "You cannot ...."을 출력하고 다시 입력 받는다.

그런데 다시 입력받고나서 그값을 그대로 리턴하게 된다.

따라서 자신이 가지고 있는 값과 상관없이 어떤 값이든 넣을 수 있게 된다.




위 처럼 가지고도 있지 않는 돈을 베팅을 할 수 있게 된다.

bet변수가 어떻게 선언되었는지 찾아보았다.

//Global Variables
int k;
int l;
int d;
int won;
int loss;
int cash = 500;
int bet;
int random_card;
int player_total=0;
int dealer_total;

전역변수 선언 부분이다. bet는 int형이다. 그러면 정수오버플로우를 시키면 어떻게 될까?

 



 

flag : YaY_I_AM_A_MILLIONARE_LOL