일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 웹해킹
- 정보처리기사 실기
- pwnable
- BOF
- System
- PWN
- Spring MVC
- Operating System
- 네트워크
- Spring Framework
- Spring
- SQL
- Payload
- wargame
- Buffer Overflow
- webhacking
- 해킹
- OS
- 워게임
- 운영체제
- Shell code
- stack overflow
- Lord of BOF
- system hacking
- hacking
- LOB
- 정보보안기사
- Pwnable.kr
- 정보보안기사 실기
- webhacking.kr
- Today
- Total
DongDD's IT
[pwnable.kr] blackjack 본문
[pwnable.kr] blackjack
Problem
C로 만든 blackjack 게임을 검사(확인) 해보라고 되어있었다.
이번 문제도 저번 문제와 마찬가지로 nc로 접속할 수 있는 port가 있었다.
소스 코드가 있는 주소가 주어져있었고 따로 실행할 수 있는 프로그램은 없었다.
100만장자가 되면 flag를 준다고 되어있었고 그만큼의 돈을 얻을 수 있냐고 되어있었다.
Source Code : http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html
소스 코드가 너무 긴 관계로 소스 코드가 있는 주소를 적어놓았다.
nc로 접속해보니 다음과 같은 화면이 나왔고 Y를 입력하게 되면 1,2,3을 입력할 수 있게 되어있었다.
1번은 게임을 시작하는 명령이였고 2번은 도움말, 3번은 종료였다.
게임을 시작하니 500$만큼의 돈이 있고 이것을 베팅해 일반적인 blackjack을 하는 프로그램이였다.
이 500$를 1000000$ 이상으로 만들어야 flag를 획득할 수 있는 것 같았다.
Solution
500$를 반복해 1000000$ 이상으로 만들기에는 너무 오래 걸리고 확실하지 않은 방법이였다.
소스 코드를 분석해 취약점을 찾았고 이를 통해 쉽게 해결할 수 있었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 | cs |
주어진 소스 코드에서 취약점이 존재하는 부분이다.
소스 코드가 너무 길어서 찾는데 어려움이 있었지만 도움말이나 종료에서는 취약점이 존재하지 않을 것 같아 게임에 관련된 함수들을 분석하다가 찾게 되었다.
먼저 cash변수는 현재 사용자가 가지고 있는 돈으로 초기에는 500으로 설정되어있다.
게임에 걸 돈을 입력받고 입력한 값이 가지고 있는 돈보다 크다면 다시 입력을 받고 아니라면 입력한 값을 return 해준다.
하지만 다시 입력받는 과정에서는 가지고 있는 돈에 상관없이 입력한 값이 바로 return 되는 것을 볼 수 있다.
입력한 값에 대한 검증을 추가로 하지 않아 가지고 있는 돈과 별개로 입력한 값이 bet로 return되게 된다.
즉, 처음에는 가지고 있는 돈(500)보다 큰 값을 입력해 if문으로 들어가고 그 이후에 1000000 이상의 값을 입력해 게임에 돈을 걸 수 있다.
필요한 검증이 없는 이 부분을 통해 cash를 1000000$ 이상으로 만들고 게임을 지속하니 flag를 획득할 수 있었다.
************** Answer & Flag **************
처음 입력 값 검증 때, cash(500)보다 큰 값을 입력해 if문으로 들어갔고 if문 안에서는 추가 검증이 없기 때문에 1000000을 입력해 게임을 진행해 백만장자가 되어 flag를 획득할 수 있었다.
Flag : YaY_I_AM_A_MILLIONARE_LOL
'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] cmd1 (0) | 2018.07.21 |
---|---|
[pwnable.kr] lotto (0) | 2018.07.14 |
[pwnable.kr] coin1 (0) | 2018.06.26 |
[pwnable.kr] shellshock (0) | 2018.06.18 |
[pwnable.kr] mistake (0) | 2018.06.14 |