Buffer Overflow란?
버퍼오버플로우는 단어의 뜻 그대로 버퍼를 넘치게 만드는 것이다. 특정 프로그램에 할당된 버퍼에 엉뚱한 데이터를 넘치도록 집어넣어 공격자가 원하는 코드를 실행 시키는 일종의 해킹 기법이기도 하다. 여기서 말하는 버퍼(Buffer)에는 스택과 힙이 있는데, 이전 발행글 - 메모리 구조에 기술된 스택과 힙의 특징을 익히고 나면 이해가 쉬울 것이다.
프로그램 취약점 측면에서 풀어 설명하자면 다음과 같다.
- 메모리 오류로 인해 잘못된 동작을 하는 프로그램 취약점.
- 프로세스가 데이터를 버퍼(힙 또는 스택)에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하게 된다.
- 벗어난 데이터는 인접 메모리를 덮어쓰게 되어 프로그램 변수와 흐름 제어 데이터가 손상될 수도 있다.
- 잘못된 프로그램 동작, 메모리 접근 오류, 잘못된 결과, 프로그램 또는 시스템 보안 누설이 발생한다.
버퍼 오버플로우 발생을 방지하기 위해 사용되는 대응 방안은 다음과 같다.
- 안전한 라이브러리 사용: 경계를 검사하지 않는 함수의 사용을 피한다. (ex - gets, scanf, strcpy)
- 포인터 가드: 포인터를 조작해 발생되는 BOF를 방지하기 위해 컴파일러 확정으로 제안된 기능
- 실행 공간 보호: 스택이나 힙 상의 코드가 실행되는 것을 막는다.
- 주소 공간 배치 난수화: 중요 데이터 영역의 주소를 임의로 프로세스 주소 공간에 배치.
- 심층 패킷 조사: 네트워크 경게에서 공격 고유 신호와 경험적으로 쌓인 데이터를 기반으로 사전 검출 가능.
BufferOverflow 동작원리
허술하게 만들어진 프로그램일 수록 BoF 동작이 쉬워진다. 예를 들어 예외처리를 하지 않거나 메모리 할당을 확실히 하지 못한 프로그램을 말한다.
하나의 프로그램은 수많은 서브루틴들로 구성되며, 서브루틴이 호출될 때 스택 영역에 함수, 변수, 리턴 주소값의 포인터를 저장하게 된다. 그리고 서브루틴이 종료되면 리턴 주소값의 포인터를 통해 복귀한다. 이때 리턴 주소값을 조작하여 공격하는 게 BOF의 시작이다. return address라고도 포현되는 이 값, 포인터를 조작해 공격자가 원하는 코드를 실행 시킨다.
할당된 공간을 모두 채우고도 저장될 데이터 크기에 제한을 두지 않아 공간이 넘치게 되고, 버퍼오버플로우가 발생한다.
'System & Reversing > 필기' 카테고리의 다른 글
pwndbg 설치 및 사용 방법 (0) | 2023.04.03 |
---|---|
올리디버그(Ollydbg) 설치 및 사용법 (0) | 2023.03.16 |
x86, x64 차이점 및 구분 (0) | 2023.03.16 |
아키텍처의 개념, 종류, 특징(+ CPU 아키텍처) (0) | 2023.03.11 |
gcc 컴파일러 (+ .so, .a, .o, .c, 비트 연산 내장 함수) (0) | 2023.03.10 |