// 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");
}
위 코드는 문제 코드에서 취약점이 되는 핵심 부분만 가져왔습니다. 문제점은 match가 6이되면 플래그가 출력됩니다. 예를 들어 랜덤 lotto 값이 123456이라고 가정하였을때 111111을 입력하면 반복문 36번 중에 6번이 조건을 통과하므로 match가 6이 됩니다. 따라서 lotto가 당첨될 확률은 매우 높습니다.
for(i=0; i<6; i++){
lotto[i] = (lotto[i] % 45) + 1; // 1 ~ 45
위 코드를 보면 lotto는 1에서 45까지의 값을 갖습니다. lotto는 unsigned char 형으로 문자열을 입력받으므로 lotto는 아스키 코드값 1~45 중에 하나가 됩니다. 따라서 아스키 코드 값 33번 !을 6번 입력하여 플래그가 나올 때 까지 입력하겠습니다. 저는 9번의 시도 끝에 플래그가 출력됬습니다.
'시스템 해킹 > pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] blukat (0) | 2021.07.29 |
---|---|
[Pwnable.kr] cmd2 (0) | 2021.07.29 |
[Pwnable.kr] blackjack (0) | 2021.07.28 |
[Pwnable.kr] coin1 (0) | 2021.07.28 |
[Pwnable.kr] shellshock (0) | 2021.07.27 |
댓글