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 |