티스토리 뷰

버퍼 오버플로우

프로세스의 메모리 구조는 text, data heap, stack 영역으로 구분되어 있다.

text 영역 프로그램 코드와 상수가 정의되어 있고, 읽기만 가능한 메모리 영역이기 때문에 데이터를 저아하려고 하면 분할 충돌을 일으켜 프로세스가 중지된다.

data 영역 전역 변수와 정적 변수가 저장되어 있는 영역이다.
heap 영역 프로그래머의 필요에 따라 동적 메모리 호출에 의해 할당되는 메모리 영역이다
stack 영역 함수 인자 값, 함수 내의 지역 변수, 함수의 반환 주소등이 저장되는 영역으로 상위 메모리 주세에서 하위 메모리 주소로 데이터가 저장된다.

버퍼 오버플로우의 기본 개념

  1. 버퍼 또는 데이터 저장 영역에 할당된 용량보다 더 많은 입력이 위치하면 다른 정보를 변경할 수 있는 조건이다. 공격자는 이런 조건을 이용하여 시스템을 중지시키거나 시스템의 제어를 갖기 위한 특별한 코드를 삽입한다.
  2. 버퍼 오버플로우는 프로세스가 정해진 크기의 버퍼 한계를 벗어나 이웃한 메모리 위치에 데이터를 겹쳐 쓰려고 시도하는 것과 같은 프로그래밍 오류의 결과로 발생한다.

스택 버퍼 오버플로우

스택 버퍼 오버플로우 공격은 보통 SetUID가 설정된 루트 권한의 프로그램을 공격대상으로 한다. 스택에 정해진 버퍼보다 큰 공격 코드를 삽입하여 반환주소를 변경함으로써 임의의 공격 코드를 루트 권한으로 실행하도록 하는 방법이다.

많은 버퍼 오버플로우공격의 핵심 요소는 오버플로우가 발생하는 버퍼에 저장되는 공격자의 코드로 실행 제어를 이동시키는 것이다. 이 코드를 셸 코드라 한다.

스택 버퍼 오버플로우 절차

  1. 공격 셸 코드를 버퍼에 저장한다.
  2. 루트 권한으로 실행되는 프로그램의 특정 함수의 스택 반환주소 버퍼를 오버플로우시켜서 공격 셸 코드가 저장되어 있는 버퍼의 주소로 덮어씌운다.
  3. 특정 함수의 호출이 완료되면 조작된 반환 주소로 셸 코드의 주소가 반환되어 셸 코드가 실행되고, 루트 권한을 획득하게 된다.

힙 오버플로우

일반적으로 힙은 프로그램과 전역 데이터 위에 위치하며 메모리 위 방향으로 커진다.

힘에 요청되는 메모리는 레코드의 연결 리스트와 같은 동적 데이터를 구조를 위해 사용된다. 만약 이런 레코드가 오버플로우에 취약한 버퍼를 가지고 있다면 연속된 메모리가 손상될 수 있다.

할당된 공간이 함수에 대한 포인터를 포함하고 있다면 공격자는 이 주소를 변경하여 겹쳐 쓴 버퍼에 있는 셸 코드를 가리키도록 할 수 있다.

버퍼 오버플로우 공격 대응책

  1. 컴파일 시간 방어 : 새 프로그램 내에서 공격을 저지하도록 프로글매을 강화하는 것을 목표로 한다.
  2. 실행시간 방어 : 존재하는 프로그램에서 공격을 발견하고 중지시키는 것을 목표로 한다.

메모리 오버플로우: 가장 흔한 종류 중 하나로, 프로그램이 할당된 메모리 영역을 초과하여 데이터를 저장하려고 할 때 발생합니다.

버퍼 오버플로우: 버퍼 오버플로우는 일반적으로 악의적인 공격에 사용되는데, 프로그램이 입력을 처리하는 동안 버퍼에 너무 많은 데이터를 쓰려고 할 때 발생합니다.

정수 오버플로우: 변수가 특정 데이터 타입의 최댓값을 초과하여 증가할 때 발생합니다.

스택 오버플로우: 함수 호출 시에 지역 변수와 함수 매개 변수가 스택 메모리에 저장되는데, 이 스택 메모리에 지정된 한계를 초과하여 데이터가 저장될 때 발생합니다

힙 오버플로우: 동적 메모리 할당을 사용할 때 메모리 할당에 대한 오류로 인해 힙 영역에 메모리가 할당되거나 해제될 때 발생할 수 있습니다

데이터 오버플로우: 데이터베이스나 파일 시스템과 같은 데이터 저장 시스템에서 데이터가 저장된 공간을 넘어서는 경우 발생합니다

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함