Buffer Overflow 란?
버그의 일종. 또는 이를 이용한 공격 방법.
프로그램이 실행될 때 입력받는 값이 버퍼를 가득 채우다 못해 넘쳐흘러 버퍼 이후의 공간을 침범하는 현상.
쉽게 말해 양동이(버퍼)에 물(값)을 받을 때(입력 받기) 물을 너무 많이 받아 바닥에 흘러 넘쳐버리는 것이라고 생각하면 된다. 주로 프로그램이 사용자에게 데이터(주로 문자열)을 입력받을 때 사용자가 말을 곧이곧대로 듣지 않고 이미 준비된 버퍼보다 더 많은 양의 데이터를 입력할 때 발생하나, 해커가 임의로 프로그램의 메모리의 값을(주로 스택) 변조할 때에도 쓰인다. 주로 이 문제는 스택에서 발생하기 때문에 '스택 오버플로(Stack Overflow)'라고도 부른다.
Buffer Overflow 공격의 개념
- 기본적인 버퍼 오버플로우 공격은 데이터의 길이에 대한 불명확한 정의를 악용한 덮어쓰기로 발생한다.
- 경계선 관리가 적절하게 수행되어 덮어쓸 수 없는 부분에 해커가 임의의 코드를 덮어쓰는 것을 의미한다.
(복귀 주소 변경 -> 임의 코드 실행) - 버퍼 오버플로우에 취약한 함수와 그렇지 않은 함수가 있는데, 프로그래머가 취약한 특정 함수를 사용하지 않는다면 공격이 훨씬 어려워진다
Buffer Overflow 공격의 종
- Stack Buffer Overflow
- 스택(함수 처리를 위해 지역 및 매개변수가 위치하는 메모리 영역) 구조 상, 할당된 버퍼들이 정의된 버퍼 한계치를 넘는 경우, 복귀 주소를 변경하여 공격자가 임의 코드를 수행
- Heap Buffer Overflow
- 힙(malloc()등의 메모리 할당 함수로 사용자가 동적으로 할당하는 메모리 영역) 구조 상, 최초 정의된 힙의 메모리 사이즈를 초과하는 문자열들이 힙의 버퍼에 할당될 시, 공격자가 데이터 변경 및 함수 주소 변경으로 임의 코드를 수행
버퍼 오버플로우에 취약한 함수가 포함된 가장 기본적인 예제 코드
int main(int argc, char *argv[])
{
char buffer[10];
strcpy(buffer, argv[1]);
printf("%s\n", &buffer);
}
- int main(int argc, char *argv[ ])
- argc는 취약한 코드인 bugfile.c가 컴파일되어 실행되는 프로그램의 인수 개수. *argv[ ]는 포인터 배열로서 인자로 입력되는 값의 번지수를 차례로 저장한다.
- argv[0]: 실행 파일의 이름
- argv[1]: 첫 번째 인자의 내용
- argv[2]: 두 번째 인자의 내용
- char buffer[10]
- 10바이트 크기의 버퍼를 할당
- strcpy(buffer, argv[1])
- 버퍼에 첫 번째 인자(argv[1])를 복사
- abcd 값을 버퍼에 저장(버퍼 오버플로우)
- prinf(“%s\n”, &buffer)
- 버퍼에 저장된 내용 출력
버퍼 오버플로우 공격은 strcpy(buffer, argv[1]) 에서 일어나고 GDB(GNU 디버거)를 이용하여 main 함수를 살펴본 다음 strcpy가 호출되는 과정 살펴봐야한다.
'seKUrity_Study : System & Reversing' 카테고리의 다른 글
[System] 함수의 에필로그 프롤로그 (0) | 2023.03.27 |
---|---|
[system 실습] crackme3 (0) | 2023.03.27 |
[system] x86, x64 register (0) | 2023.03.19 |
[system 실습] CrackMe2.exe (0) | 2023.03.19 |
[system 실습] abex crackme #1.exe (0) | 2023.03.19 |