[2pt]lotto

Pwnable.kr 2015. 8. 6. 21:37
        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");

        }


Introduction:

  본 문제는 사용자가 6자리의 문자를 입력하여 프로그램에서 생성한 6자리의 번호를 맞추는 문제. 

How to solve:

  프로그램을 조작해 lotto배열과 submit배열의 값, 그리고 match의 값을 출력해보면 본 프로그램은 로직상 문제가 있음을 확인할 수 있다. 그림 1에서 나타나듯, 각 배열의 값을 비교하는 로직은 lotto의 배열의 1문자에 대해 submit배열의 6문자를 비교하게 된다.(설명이 좀 이상한듯..) 즉, 인풋 값으로 "\x20\x20\x20\x20\x20\x20"을 넣었을 때 match==6의 상황(line 43)은 실제 로또의 확률보다 훨씬 높은 확률로 나타나게 되고, 이정도 확률은 BF를 수행해도 쉽게 답을 얻을 수 있을 정도로 빈번하게 나타난다.

<그림 1> lotto배열과 submit배열, 그리고 match값을 출력한 결과


Command line:

Submit your 6 lotto bytes :       

Lotto Start!

bad luck...

- Select Menu -

1. Play Lotto

2. Help

3. Exit

1

Submit your 6 lotto bytes :       

Lotto Start!

sorry mom... ~!@#$%^&*()_+~!@#$%^&*()_+~!@#$%^&*()_+

- Select Menu -

1. Play Lotto

2. Help

3. Exit

'Pwnable.kr' 카테고리의 다른 글

[1pt]mistake  (0) 2015.08.06
[1pt]cmd1  (0) 2015.08.06
[1pt]fd  (0) 2015.08.06
[5pt]bof  (0) 2015.08.06
[1pt]random  (0) 2015.08.06
Posted by Hugh_K
l