ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddler's Bottle] blackjack write up
    System hacking training/pwnable.kr 2018. 7. 31. 21:52



    오늘을 pwnable.kr 의 blackjack - 1pt 문제를 풀이하였습니다.
    문제 pt는 1pt 인데 소스코드의 양을 보고 조금 놀랐습니다.

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

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


    Running at : nc pwnable.kr 9009

    flag는 백만장자가 되면 준다고 하네요.
    사실 이 부분을 보지 않고 취약한 부분을 찾기 위해서 무작정 소스코드를 분석했는데 정말 쓸데없는 짓이였습니다.

    문제의 소스코드 상에서는 flag가 어떻게 출력되는지는 알아내지 못했습니다.
    소스코드를 분석해보면

    main() -> asktitle() { yes or no } -> input 1 -> play()
    기본적으로 위의 함수대로 돌아갑니다. 물론 자세히 들어가보면 yes일때 no 일때 다르게 행동을 하지만 결론적으로 yes를 해야만 게임을 즐길 수 있는 형태입니다.
    그래서 결국에는 위 함수대로 진행이 됩니다.





                  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    <- my input value

    그렇게 main() 의 아스키 아트를 거쳐 asktitle() 의 input값을 y를 눌러 진행을 한 뒤 1을 누르면 play() 가 호출됩니다.

    Cash: $500
    -------
    |H    |
    |  7  |
    |    H|
    -------

    Your Total is 7

    The Dealer Has a Total of 11

    Enter Bet: $

    이렇게 기본 Cash $500과 Enter Bet: $ 하고 입력을 받습니다.
    취약점은 여기서 터지는데요.

    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

    Betting 함수에서 우리가 배팅하는 값을 받는데 bet > cash 일때 bet을 다시 입력받으면서 그에 대한 값 체크가 없고, 바로 그 값을 return 하기 때문에 전역 변수 bet은 우리가 조작할 수 있다는 것이죠.
    그렇다면 이제 백만장자가 될 수 있으니 그대로 500보다 더 큰 값을 입력해서 if문 안으로 들어오고, 백만의 수를 입력해주면 될것같습니다.

    Cash: $500
    -------
    |H    |
    |  7  |
    |    H|
    -------

    Your Total is 7

    The Dealer Has a Total of 11

    Enter Bet: $1000

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


    Would You Like to Hit or Stay?
    Please Enter H to Hit or S to Stay.
    h
    -------
    |C    |
    |  Q  |
    |    C|
    -------

    Your Total is 17

    The Dealer Has a Total of 16

    Would You Like to Hit or Stay?
    Please Enter H to Hit or S to Stay.
    s

    You Have Chosen to Stay at 17. Wise Decision!

    The Dealer Has a Total of 17
    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************flag************_LOL


    Cash: $100000500
    -------
    |H    |
    |  J  |
    |    H|
    -------

    Your Total is 10

    The Dealer Has a Total of 10

    Enter Bet: $

    이렇게 간단하게 백만장자가 되면서 flag가 출력됩니다.
    이상 blackjack 풀이를 마칩니다.
    반응형
Designed by Tistory.