오늘을 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 풀이를 마칩니다.