본문 바로가기

해킹 공격

[NOOBHACK] 언더플로우??

오늘은 언더플로우에 대해 알아보자

오버플로우와 같은 원리로 발생하는 취약점인데

한 변수가 담을 수 있는 수의 크기를 넘어서면 모든 비트가 초기화 되면서 최소값으로 다시 시작하는 것이 오버 플로우의 개념이였다

 

예시:

0111111

라는 8비트 길이의 숫자가 있다 여기서 첫 번째 비트가 0인것은 음수 양수를 구분하기 위한 비트이다(0은 양수 1은 음수)

그렇기 때문에 이 상태에서 1를 더하면

10000000

이 되면서 음수 양수를 구분하는 비트가 1이 되며 모든 비트가 0이 되어 버린다

근데 음수 비트에는 모든 것이 반대이기 때문에 음수 비트에서 0은 1을 뜻한다

즉, 이 숫자는 실제로 0이 아닌 -128인 것이다!! 

 

그러므로 오버플로우가 일어나면 변수가 담을 수 있는 제일 작은 값 부터 시작한다.

그러면 같은 원리인 언더플로우를 설명 하자면

 

10000000

라는 음수형 비트가 있는 상태에서 똑같이 1을 더하면

(음수 비트기 때문에 음수 비트에 1을 더하는 것은 실제 비트에 -1를 하는 것과 같다)

01111111

이 되므로 양수의 최대값이 되어 언더플로우가 발생하게 된다.

이 코드는 언더플로우의 예시이다.

 

#include "stdio.h"
#include <limits.h>

int main() {
char a = CHAR_MIN;
a -= 1;
printf("%d", a);

return 0;
}