気まぐれブログ(日記・技術記事・研究のことなど)

気まぐれに更新します.温かい目で見ていただければ...

pwnable.kr writeup [blackjack]

この問題は, blackjackのゲームでmillionareになればflagゲットとなります.

問題

Hey! check out this C implementation of blackjack game!
I found it online

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

I like to give my flags to millionares.
how much money you got?

cboard.cprogramming.com


Running at : nc pwnable.kr 9009

解説

とりあえずゲームをやってみましょう. ゲームの仕組みは以下のとおりです.

(1)所持金は$500.
(2)掛け金を設定.
(3)ブラックジャックゲームに勝利したら掛け金分の報酬をゲット.
(4)負けたら所持金から掛け金分を差し引かれる.

普通に考えて, 所持金$500からミリオネアになるのは非現実的ですね. 何かゲームに存在する脆弱性を利用してミリオネアになることを考えましょう.

こっからはソースコードをじっくり読んでいくしかないのですが, 掛け金に関するコードでおかしい部分が存在します.

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

掛け金を設定するとき, 所持金より大きい値に設定すると, 1回目は「You cannot bet more money than you have」といってもう1回入力させるのですが, 2回目は入力された値をそのままリターンしてしまっています.

つまり, 1回目2回目ともに$1,000,000となるように掛け金を設定し, そのゲームに勝てばミリオネアになれます.




              222                111                            
            222 222            11111                              
           222   222          11 111                            
                222              111                               
               222               111                           

CCCCC     SS            DD         HHHHH    C    C                
C    C    SS           D  D       H     H   C   C              
C    C    SS          D    D     H          C  C               
CCCCC     SS          D DD D     H          C C              
C    C    SS         D DDDD D    H          CC C             
C     C   SS         D      D    H          C   C               
C     C   SS        D        D    H     H   C    C             
CCCCCC    SSSSSSS   D        D     HHHHH    C     C            

                        21                                   
     DDDDDDDD      HH         CCCCC    S    S                
        DD        H  H       C     C   S   S              
        DD       H    H     C          S  S               
        DD       H HH H     C          S S              
        DD      H HHHH H    C          SS S             
        DD      H      H    C          S   S               
     D  DD     H        H    C     S   S    C             
      DDD      H        H     CCCCC    S     S            

         222                     111                         
        222                      111                         
       222                       111                         
      222222222222222      111111111111111                       
      2222222222222222    11111111111111111                         


                 Are You Ready?
                ----------------
                      (Y/N)
                        Y


Enter 1 to Begin the Greatest Game Ever Played.
Enter 2 to See a Complete Listing of Rules.
Enter 3 to Exit Game. (Not Recommended)
Choice: 1







Cash: $500
-------
|D    |
|  J  |
|    D|
-------

Your Total is 10

The Dealer Has a Total of 3

Enter Bet: $1000

You cannot bet more money than you have.
Enter Bet: 100000000000


Would You Like to Hit or Stay?
Please Enter H to Hit or S to Stay.
H
-------
|S    |
|  A  |
|    S|
-------

Your Total is 21

The Dealer Has a Total of 7
Unbelievable! You Win!

You have 1 Wins and 0 Losses. Awesome!

Would You Like To Play Again?
Please Enter Y for Yes or N for No
Y

YaY_I_AM_A_MILLIONARE_LOL


Cash: $1215752692
-------
|H    |
|  7  |
|    H|
-------

Your Total is 7

The Dealer Has a Total of 6

Enter Bet: $    



flagゲットですね.