Dreamhack를 풀다 발견한 Integer Overflow에 대해서 알아봅시다.
Integer Overflow
Integer Overflow는 주어진 자릿수로 표현할 수 있는 범위(최대값보다 크거나 최소 표현 가능한 값보다 낮음)를 벗어나는 숫자 값을 생성하려고 시도할 때 발생할 수 있는 문제입니다.
Exam
아래의 예시 코드를 보면 number
라는 입력값을 받습니다.
- nubmer는 0보다 같거나 작으면 로직을 통과합니다.
- number -1 를 합니다.
- number가 0보다 크면 로직을 통과합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int main() {
int number;
printf("Input Number! \n");
scanf("%d",&number);
if(number <= 0){
number = number-1;
if (number > 0 ){
printf("[!] Integer Overflow ! \n");
}
else{
printf("[-] number is not greater than 0 \n");
}
}
else{
printf("[-] number is greater than 0 \n");
}
return 0;
}
Exploit
위의 예시는 언뜻 보면 말도 안되는 로직을 가지고 있습니다.
하지만 Integer Overflow
를 통해 해당 로직을 통과할 수 있습니다.
int 형의 범위는 –2,147,483,648 ~ 2,147,483,647
입니다.
만약 2147483648
을 입력하면 -> 0이 되어 첫번째 if문을 통과하고 -1를 하여 다시 최대값으로 변환되므로 두번째 로직을 통과할 수 있습니다.