본문 바로가기

포너블

[포너블/pwnable.kr] blackjack

blackjack

문제 파일은 http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html 에서 확인할 수 있다.

 

nc [pwnable.kr](http://pwnable.kr) 9009 를 실행해 보면

 

이렇게 blackjack 게임을 할 수 있게 된다.

 

코드를 좀 살펴 보려고 했는데… 코드가 너무 길다.

하나하나 다 살펴 보긴 눈 빠질 것 같아서 results, cash, flag… 등등 특정 단어만 찾아 봤는데… 부분만 보니까 취약점을 못 찾겠어서 결국 처음부터 쭉 봤다.

 

그러다가 문득 워게임들을 풀면서 범위 확인을 제대로 확인하지 않아 생기는 취약점이 떠올랐고, cash의 범위를 확인해 주는 코드를 찾아 보았다.

 

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

 

게임을 시작하기 전, 베팅에 얼마를 걸지 정하는 부분인데

베팅 금액이 가지고 있는 cash 보다 큰지만 검사하고, 음수인 것은 검사를 안 하는 것을 볼 수 있다.

 

if(p==21) //If user total is 21, win
         {
             printf("\nUnbelievable! You Win!\n");
             won = won+1;
             cash = cash+bet;
             printf("\nYou have %d Wins and %d Losses. Awesome!\n", won, loss);
             dealer_total=0;
             askover();
         }

         if(p>21) //If player total is over 21, loss
         {
             printf("\nWoah Buddy, You Went WAY over.\n");
             loss = loss+1;
             cash = cash - bet;
             printf("\nYou have %d Wins and %d Losses. Awesome!\n", won, loss);
             dealer_total=0;
             askover();
         }

 

게임을 진행하는 함수의 일부분이다.

게임을 이겼을 때는 cash = cash + bet, 질 때는 cash = cash - bet 으로 cash에 저장된다.

bet에 음수를 넣어 줄 경우, 졌을 때 cash에 돈이 더 많아질 것을 예상할 수 있다.

 

따라서 bet에 -1000000을 넣어 보면

 

cash가 많아지면서 플래그가 출력되었다.

'포너블' 카테고리의 다른 글

[포너블/pwnable.kr] cmd2  (0) 2023.08.30
[포너블/pwnable.kr] cmd1  (0) 2023.08.30
[포너블/pwnable.kr] passcode  (0) 2023.08.30
[pwnable.kr/포너블] random  (0) 2023.08.24
[pwnable.kr/포너블] bof  (0) 2023.07.30