development

스택 오버플로와 버퍼 오버플로의 차이점은 무엇입니까?

big-blog 2020. 11. 29. 11:57
반응형

스택 오버플로와 버퍼 오버플로의 차이점은 무엇입니까?


프로그래밍에서 스택 오버플로와 버퍼 오버플로의 차이점은 무엇입니까?


스택 오버플로는 특히 실행 스택이 예약 된 메모리 이상으로 커지는 경우를 나타냅니다. 예를 들어, 종료없이 자신을 재귀 적으로 호출하는 함수를 호출하면 각 함수 호출이 새 스택 프레임을 생성하고 스택이 결국 예약 된 것보다 더 많은 메모리를 소비하므로 스택 오버플로가 발생합니다.

버퍼 오버플로는 프로그램이 버퍼에 할당 된 메모리의 끝을 넘어서 쓰는 경우를 말합니다 (스택뿐만 아니라 힙 포함). 예를 들어 힙에서 할당 된 배열의 끝을 지나서 쓰는 경우 버퍼 오버플로가 발생합니다.


주요 차이점은 스택과 버퍼의 차이를 아는 것입니다.

스택은 실행 프로그램이 실행되도록 예약 된 공간입니다. 함수를 호출하면 해당 매개 변수와 반환 정보가 스택에 배치됩니다.

버퍼는 단일 용도로 사용되는 일반적인 메모리 덩어리입니다. 예를 들어 문자열은 버퍼입니다. 할당 된 것보다 더 많은 데이터를 문자열에 쓰면 오버런 될 수 있습니다.


스택 오버플로 : 현재 스레드에 할당 된 메모리에 대해 스택에 너무 많은 것을 넣었습니다.

버퍼 오버 플로우 : 현재 할당 된 버퍼의 크기를 초과했으며 크기에 맞게 크기를 조정하지 않았습니다 (또는 더 이상 크기를 조정할 수 없음).


여기서 알고 싶은 것 이상 :

스택 오버플로

버퍼 오버 플로우


스택 오버플로는 스레드의 스택 크기가 해당 스레드의 최대 허용 스택 크기를 초과하는 경우입니다.

버퍼 오버 플로우는 현재 프로그램에 의해 할당되지 않은 값이 메모리에 기록되는 경우입니다.


버퍼 오버 플로우는 일반적으로 스택이든 힙이든 메모리 버퍼가 경계를 넘어 액세스 될 때마다 나타납니다. 스택 오버플로는 스택이 할당 된 제한을 초과했으며 대부분의 시스템 / OS에서 힙을 통해 실행 중임을 의미합니다.


"스택과 버퍼의 차이점은 무엇입니까?"라고 말하는 것이 아닙니다. -그러면 더 빠르게 더 많은 통찰력을 얻을 수 있습니다. 그 정도까지 도달 한 후에는 이러한 각 요소가 오버플로된다는 것이 무엇을 의미하는지 생각할 수 있습니다.


1. 스택 기반 버퍼 오버플로 • 프로그램이 의도 된 데이터 구조 (고정 길이 버퍼) 외부의 프로그램 호출 스택에있는 메모리 주소에 쓸 때 발생합니다. • 스택 기반 프로그래밍의 특징 1.“스택”은 자동 변수가 할당되는 메모리 공간입니다. 2. 함수 매개 변수는 스택에 할당되고 시스템에 의해 자동으로 초기화되지 않으므로 초기화 될 때까지 가비지가 있습니다. 3. 함수가주기를 완료하면 스택의 변수에 대한 참조가 제거됩니다. (즉, 함수가 여러 번 호출되면 함수가 호출되고 종료 될 때마다 해당 지역 변수와 매개 변수가 재생성되고 파괴됩니다.)
• 공격자는 스택 기반 버퍼 오버플로를 이용하여 덮어 쓰기를 통해 다양한 방식으로 프로그램을 조작합니다.
1. 공격자에게 도움이 될 수있는 프로그램의 동작을 변경하기 위해 스택 메모리의 버퍼 근처에있는 로컬 변수.
2. 스택 프레임에 주소를 반환합니다. 함수가 반환되면 공격자가 지정한 반환 주소 (일반적으로 사용자 입력으로 채워진 버퍼)에서 실행이 다시 시작됩니다. 3. 나중에 실행되는 함수 포인터 또는 예외 처리기. • 익스플로잇을 극복하기위한 요소는
1. 주소의 Null 바이트 2. 쉘 코드 위치의 가변성 3. 환경 간의 차이 쉘 코드는 소프트웨어 취약점 악용에 사용되는 작은 코드 조각입니다.

2. 힙 버퍼 오버플로

• 힙 데이터 영역에서 발생합니다. • 오버플로는 응용 프로그램이 버퍼에 포함하도록 설계된 것보다 더 많은 데이터를 버퍼에 복사 할 때 발생합니다. • 소스가 대상에 맞는지 먼저 확인하지 않고 데이터를 버퍼에 복사하는 경우 악용되기 쉽습니다. • 스택 기반 및 힙 기반 프로그래밍의 특성 : • "힙"은 동적 개체가 할당 될 때 메모리 공간 인 "자유 저장소"입니다. • 힙은 동적으로 할당 된 new (), malloc () 및 calloc () 함수의 메모리 공간입니다. • 동적으로 생성 된 변수 (예 : 선언 된 변수)는 실행 전에 힙에 생성되고 객체의 수명주기가 완료 될 때까지 메모리에 저장됩니다. • 악용이 수행됩니다. • 데이터를 손상시켜 연결된 목록 포인터와 같은 내부 구조를 재정의합니다. • 프로그램 기능을 무시하기위한 포인터 교환


버퍼 오버 플로우를 언급하는 대부분의 사람들은 스택 오버 플로우를 의미합니다. 그러나 오버플로는 스택에만 국한되지 않는 모든 영역에서 발생할 수 있습니다. 힙 또는 bss와 같은. 스택 오버플로는 스택의 반환 주소 덮어 쓰기로 제한되지만 반환 주소를 덮어 쓰지 않는 일반 오버플로는 다른 지역 변수를 덮어 쓸 수 있습니다.


RAM 다이어그램을 사용하여 더 간단하게 설명하겠습니다. 시작하기 전에 StackFrame, Heap Memory에 대해 읽어 보는 것이 좋습니다.

보시다시피 스택은 스택이라고 가정하고 아래쪽으로 (화살표로 표시됨) 커집니다. 커널 코드, 텍스트, 데이터는 모두 정적 데이터이므로 고정되어 있습니다. 동적 힙 부분이 위쪽으로 커집니다 (화살표로 표시됨).

여기에 이미지 설명 입력

참고 URL : https://stackoverflow.com/questions/1120575/what-is-the-difference-between-a-stack-overflow-and-buffer-overflow

반응형