정보보안

Stack Buffer OverFlow 공격

닉네임못짓는사람 2020. 11. 14. 18:48
반응형

스택 버퍼 오버플로우 공격에 대해서 알려면 먼저 스택(Stack)의 구조에 대해서 숙지해야 한다.

일단 스택은 LIFO(Last in First Out)의 자료구조인데, 말 그대로 마지막에 들어간 데이터가 가장 먼저 나오는 구조이다.

그림으로 표현하면 다음과 같다.

위의 스택 구조는 Intel계열의 스택 구조로 스택의 아래가 뚫려있는 모양이다.

반대로 스택의 위가 뚫려있는 모양도 있는데 이는 모토로라 계열의 스택 구조이다.

 

스택의 구조는 총 4개로 나뉘며 일단 위에서 말한 Intel계열과 모토로라 계열의 스택으로 나뉜다.

그리고 스택의 가장 끝 데이터(Top)을 가리키고 있는 방식에 따라 두 가지로 나뉘는데,

첫 번째 방법의 경우 실제 데이터가 담겨있는 메모리를 가리키고 있는 방법이다.

이 방법은 데이터가 있는 공간을 바로 가리키고 있기 때문에 데이터의 출력이 빠르지만,

입력 시 메모리 공간을 새로 마련해야 하기 때문에 입력은 느리다.

 

두 번째 방법의 경우 실제 데이터가 담긴 메모리가 아닌 그 바로 위(Intel은 아래)의 빈 메모리 공간을

미리 마련해두고 해당 공간을 가리키고 있는 경우이다.

이 방법의 경우 빈 메모리를 가리키고 있기 때문에 데이터의 입력은 빠르지만,

출력 시 데이터가 있는 곳으로 이동해야 하기 때문에 출력은 느리다.

 

이러한 스택 구조를 메모리 영역에서 사용하고 있는데, 이 공간에서 함수의 호출과 동작이 이루어진다.

먼저, 함수가 실행되면 스택 내에 해당 함수를 위한 영역(스택 프레임)이 할당되는데 가장 먼저 해당 함수가 끝나면

그다음에 수행해야 할 명령어의 주소(return address)가 저장된다.

그리고 ebp가 저장되고 함수 동작을 수행하는데, 자세한 설명은 생략하겠다.

함수가 수행을 끝내고 종료하게 되면 return address를 통해 위에서 말했던 다음 실행할 명령어 주소로 이동해서 종료한다.

 

이때 버퍼 오버플로우 공격 기법을 사용한다.

일단 버퍼는 데이터를 전송할 때 전송하는 동안 데이터를 일시적으로 보관하는 메모리 영역을 이야기한다.

예를 들어 C언어의 gets함수를 사용할 때 해당 함수는 입력받는 문자열의 길이를 검사하지 않고 그냥 변수에 때려 박는다.

그러면 본래 변수가 사용하기 위해 할당된 메모리를 넘어서 다른 곳에서 사용하는 메모리에

해당 데이터를 덮어쓰게되는데, 이렇게 자신이 사용해야 할  개념을 버퍼 오버플로우라고 한다.

 

 

스택 버퍼 오버플로우는 이를 스택 영역에서 발생시키는 것으로 임의의 데이터를 메모리에 덮어 씌움으로써

프로그램이 정상적으로 수행되지 못하도록 하거나 본래 스택에 저장된 return address를 변조시켜서 공격자가

원하는 코드가 저장된 메모리 주소로 이동시켜 해당 코드를 실행하도록 하는 공격 방법이다.

 

반응형

'정보보안' 카테고리의 다른 글

해시(Hash)란?  (0) 2022.01.29
레이스 컨디션(Race Condition) 공격  (0) 2020.11.07
Buffer OverFlow 대응방안  (1) 2020.10.04