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 |