이번에는 blackjack 문제를 풀어보았다.
문제를 보니 백만장자가 되면 flag를 주겠다는 것 같다.
nc pwnable.kr 9009를 통해 접속해보았다.
이렇게 3가지 메뉴가 뜨는데 백만장자가 되기 위해서는 게임을 해야하니 1을 선택해준다.
1을 선택하면 위와 같은 화면이 뜨는데 어떻게 진행해야 할 지 잘 몰라서 문제에 적혀있는 사이트를 통해 blackjack 게임의 코드를 살펴보기로 했다.
대충 21에 가까운 수를 얻어야 이기는 게임인 것 같은데 cash가 500인 상황에서부터 1000000까지 가려면 굉장히 많은 과정을 거쳐야 하니 무엇인가 꼼수를 부릴만한 것이 있는 지 살펴보았다.
여러가지 함수들과 함게 코드가 굉장히 길었는데 1번 메뉴를 선택시 play() 함수를 실행하는 것으로 보아 일단 play 함수를 확인해보았다.
코드가 굉장히 긴데, 이 중에서 이용할만한 부분을 뽑아보니 아래의 두 가지였다.
첫번째는 이 부분이다.
사용자가 배팅한 bet 값과 사용자가 보유한 cash 값을 비교하여 bet가 더 클 경우 다시 금액을 배팅하도록 되어있는데, 이 부분에서 cash 값과 비교하는 과정 없이 바로 bet 값이 리턴된다.
즉, 두번째 배팅 땐 bet 값이 cash 값보다 커도 그대로 bet 값이 유지되므로 여기서 1000000을 입력해줄 수 있는 것이다.
두번째는 이 부분이다.
이 부분이 짧아서 가져오긴 했지만 p가 21보다 작거나 같을 경우에 딜러의 총합이 21일 때에도 해당되는 내용이다.
즉, 사용자가 지는 경우에 해당하는 내용이다.
질 경우 보유한 cash 값에서 배팅한 bet 값을 빼는데 여기서 bet 값에 음수를 주면 cash 값에 + 되므로 bet에 -1000000을 입력해주고 게임에서 졌을 때 cash 값에 +1000000 된다는 의미이다.
위의 두 가지 경우를 각각 이용하여 게임을 통해 1000000달러를 따보았다.
1) 첫번째 부분 이용
첫번째 배팅 때 cash 보다 큰 값을 넣어서 두번째 배팅으로 넘어가 똑같이 cash보다 큰 1000000을 입력한 경우이다.
2) 두번째 부분 이용
음수, 그러니까 -1000000을 입력한 경우이다.
두 경우 모두에서 무사히 1000000달러를 따서 flag를 얻을 수 있었다.
위에서 얻은 flag 내용을 넣어주면
문제를 클리어했다는 창을 볼 수 있다.
'Security > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Toddler's Bottle - bof (0) | 2022.05.07 |
---|---|
[pwnable.kr] Toddler's Bottle - input (0) | 2022.05.05 |
[pwnable.kr] Toddler's Bottle - lotto (0) | 2021.11.28 |
[pwnable.kr] Toddler's Bottle - mistake (0) | 2021.11.21 |
[pwnable.kr] Toddler's Bottle - random (0) | 2021.11.15 |
댓글