Home Integer Overflow
Post
Cancel

Integer Overflow

Dreamhack를 풀다 발견한 Integer Overflow에 대해서 알아봅시다.


Integer Overflow

Integer Overflow는 주어진 자릿수로 표현할 수 있는 범위(최대값보다 크거나 최소 표현 가능한 값보다 낮음)를 벗어나는 숫자 값을 생성하려고 시도할 때 발생할 수 있는 문제입니다.

Exam

아래의 예시 코드를 보면 number라는 입력값을 받습니다.

  1. nubmer는 0보다 같거나 작으면 로직을 통과합니다.
  2. number -1 를 합니다.
  3. 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를 하여 다시 최대값으로 변환되므로 두번째 로직을 통과할 수 있습니다.

integer_overflow