오버플로는 무엇일까? (버퍼 오버플로의 뜻과 그로 인한 문제점!)

2017. 11. 27. 21:53Programming/Etc...

여러분 야하롱~! Nitro입니다.

오늘은 프로그램을 만들다보면 자주 보이는 단어인 오버플로'Overflow' 에 관하여 이야기를 나누어볼까 합니다!

이는 지난 포스팅에서도 이어지는 부분이 있으니, 참고해주시면 감사드리겠습니다.



[Programing] - 컴퓨터의 수, 컴퓨터의 저장 단위에 대해 알아보자! Part 1[진법] (Bit, Byte, Kb, Mb... etc)

[Programing/Etc...] - 컴퓨터의 수, 컴퓨터의 저장 단위에 대해 알아보자! Part 2[비트부터 시작하는 정보 단위] (Bit, Byte, Kb, Mb... etc)

[Programing/Etc...] - 컴퓨터의 수, 컴퓨터의 저장 단위에 대해 알아보자! Part 3[2진수 정수의 표현, 보수와 음수] (Bit, Byte, Kb, Mb... etc)

먼저! 오버플로'Overflow' 는 무슨뜻일까요?


과다.. 흠...

흥미롭군요.



'어떠한 것이 용량을 초과하여 넘쳐 흐르는 것'을 뜻하는 현상에 어올리는 단어입니다.

실제로 컴퓨터에서 사용되는 오버플로는 한정된 메모리 용량을 넘어가는 값이 들어갈때 발생하는 오류입니다.


버퍼 오버플로를 기준으로 설명해드리자면,

보통 이진법으로 표기하는 4비트 변수에 15를 넣고,

그곳에 1을 더한다면 이진법으로 표기하는 5비트 변수가되어 16이 저장되어아 하는것이라고 생각하지만.


실제로 컴퓨터에서는

이렇게, 자신의 영역을 초과하여 0이 되버리는 현상을 버퍼 오버플로 라고 합니다.


이같은 경우는 다른 버퍼의 공간을 침범해버리기에 꽤나 위험한 보안 취약점이 됩니다!

사용자의 입력값 바로 뒤 공간에 통신에 필요한 정보가 저장되어있다면,

그 정보를 덮어씌어서 정상적인 통신이 불가능해지는 것 입니다.


이러한 버퍼 오버플로로 인한 가장 유명한 사례로는 하트블리드 사태가 있습니다.

버퍼 오버플로를 영역침범이 아닌 값 호출로 이용하여 뒤에 이어질 정보들을 뜯어내는 방식인데요.

이는 이곳에서 자새하게 알아보실 수 있으십니다.



이것은 부호비트가 포함되지 않았을때의 예제입니다.

[Programing/Etc...] - 컴퓨터의 수, 컴퓨터의 저장 단위에 대해 알아보자! Part 3[2진수 정수의 표현, 보수와 음수] (Bit, Byte, Kb, Mb... etc)

윗 링크의 글을 읽어 보셨다면, 부호비트의 존제또한 알고있으실 것입니다.


그리하여 발생하는 오류는 아레와 같습니다....

(xkcd 571화 Can't Sleep)


오버플로가 부호비트를 침범할 경우, 위 사진처럼 갑작스럽게 음수가 되버릴 수 있습니다.



이러한 오버플로들은 큰 위험이 됩니다.

위에서 언급했던 하트블리드 사태로 시작하여, 아리안 5로켓 폭팔사건또한 큰 일이였습니다.

당시 5억달러 짜리 위성을 쏘아올리던도중,

오버플로가 발생하여 통째로 히오스행을 당해버렸던것...


그것 말고도 지금의 Be폭력주의자가 되어버린 문명 시리즈의 간디 또한 오버플로우로 인한 오류였습니다. (!!!)

간디 시리즈의 여담은 이곳을 참고해주세요!


또한 윈도우 XP에서도 이러한 오류가 있는데요.

9999년 12월 31일 오후 11시 59분 59초에서 1초후인 10000년이 되면, CPU의 점유율이 급상승하는 오류인데요.

이것 또한 오버플로로 인한 오류인것으로 알고 있습니다.

(영상은 이곳!)


[참고]

https://namu.wiki/w/%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C#s-2


프로그램을 만들다 보면, 가끔식 나타나는 현상인 오버플로에 관하여 알아보았습니다!

비주얼 스튜디오에서는 오버플로가 발생하면 예외처리를 하여 사용자들에게 알려주기도 하지만,

오버플로는 메모리 수정이 이루어지는 모든곳에서 발생할 가능성이 있으므로 항상 주의해야합니다.


여담으로 프로그램에서 1을 0으로 나누거나, 무한적인 숫자를 대입,

혹은 변수형보다 큰 값(범위 초과)를 선언할경우 또한 오버플로가 발생합니다.


오버플로같은경우는 프로그래머가 얼마나 깊게 생각하였는지, 예외처리는 했는지 등등...

프로그래머의 실력이 들어나는 부분이니 아무쪼록 조심합시다.


그럼 이만, Nitro였구요.

다음 포스팅에서 뵙도록 합시다!


반응형