[Pwnable.kr] lotto
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
 
unsigned char submit[6];
 
void play(){
    
    int i;
    printf("Submit your 6 lotto bytes : ");
    fflush(stdout);
 
    int r;
    r = read(0, submit, 6);
 
    printf("Lotto Start!\n");
    //sleep(1);
 
    // generate lotto numbers
    int fd = open("/dev/urandom", O_RDONLY);
    if(fd==-1){
        printf("error. tell admin\n");
        exit(-1);
    }
    unsigned char lotto[6];
    if(read(fd, lotto, 6!= 6){
        printf("error2. tell admin\n");
        exit(-1);
    }
    for(i=0; i<6; i++){
        lotto[i] = (lotto[i] % 45+ 1;        // 1 ~ 45
    }
    close(fd);
    
    // calculate lotto score
    int match = 0, j = 0;
    for(i=0; i<6; i++){
        for(j=0; j<6; j++){
            if(lotto[i] == submit[j]){
                match++;
            }
        }
    }
 
    // win!
    if(match == 6){
        system("/bin/cat flag");
    }
    else{
        printf("bad luck...\n");
    }
 
}
 
void help(){
    printf("- nLotto Rule -\n");
    printf("nlotto is consisted with 6 random natural numbers less than 46\n");
    printf("your goal is to match lotto numbers as many as you can\n");
    printf("if you win lottery for *1st place*, you will get reward\n");
    printf("for more details, follow the link below\n");
    printf("http://www.nlotto.co.kr/counsel.do?method=playerGuide#buying_guide01\n\n");
    printf("mathematical chance to win this game is known to be 1/8145060.\n");
}
 
int main(int argc, char* argv[]){
 
    // menu
    unsigned int menu;
 
    while(1){
 
        printf("- Select Menu -\n");
        printf("1. Play Lotto\n");
        printf("2. Help\n");
        printf("3. Exit\n");
 
        scanf("%d"&menu);
 
        switch(menu){
            case 1:
                play();
                break;
            case 2:
                help();
                break;
            case 3:
                printf("bye\n");
                return 0;
            default:
                printf("invalid menu\n");
                break;
        }
    }
    return 0;
}
 
 
cs

보면 입력한 로또의 숫자를 char 변수 6개 크기의 배열 submit[6]에 저장한 후 lotto[6]에는 랜덤하게 만든 수 6개를 저장해 비교해서 i=0~5, j=0~5에 대해 lotto[i]==submit[j] 일 때 마다 카운트를 증가시켜 카운트가 6일 경우 flag를 읽을 수 있습니다.


6개 다 맞을 확률이 대략 1/10000000 정도여서 천만번 돌려도 되지만, 그것보다는 i와 j가 다를 때 submit[i] != submit[j] 인지를 확인하지 않는 점을 공략해서 submit[0~5]를 전부 동일하게 둘 경우 lotto[0~5]에서 단 한번만이라도 등장한다면 바로 카운트가 6이 될 것입니다.


 



'워게임 > Pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] uaf  (0) 2018.01.15
[Pwnable.kr] cmd2  (0) 2018.01.15
[Pwnable.kr] cmd1  (0) 2018.01.15
[Pwnable.kr] blackjack  (0) 2018.01.15
[Pwnable.kr] coin1  (3) 2018.01.15
[Pwnable.kr] shellshock  (0) 2018.01.15
  Comments