BOF(Buffer Overflow)
연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에 자료를 읽거나 쓰려고 할 때 발생하는 취약점으로 스택이 꽉차게 되면 RET값을 변조해서 공격하는 방법이 가장 흔하게 쓰인다. 즉, 한정된 용량의 버퍼로 인해 프로그램 에러를 유발 시키도록 하는 건데 프로세스 메모리 상에 지정된 버퍼를 초과하는 입력 값을 발생시키는 stack overflow, 원래 프로그램이 가르키고 있는 포인터 영역을 바꿔서 공격하는 heap overflow가 있다.
종류
(stack에 존재하는 buffer에 대한 공격이냐, heap에 존재하는 buffer에 대한 공격이냐에 따라 구분 )
Stack Buffer Overflow
스택(함수 처리를 위해 지역 및 매개변수가 위치하는 메모리 영역) 구조 상, 할당된 버퍼들이 정의된 버퍼 한계치를 넘는 경우, 복귀 주소를 변경하여 공격자가 임의 코드를 수행.
스택 오버 플로우 vs 스택 버퍼 오버 플로우
스택 오버 플로우: 스택 영역이 너무 많이 확장돼서 발생하는 버그
스택 버퍼 오버플로우: 스택에 위치한 버퍼에 버퍼의 크기보다 많은 데이터가 입력되어 발생하는 버그(스택의 버퍼에서 발생하는 오버 플로우)
Heap Buffer Overflow
힙(malloc()등의 메모리 할당 함수로 사용자가 동적으로 할당하는 메모리 영역) 구조 상, 최초 정의된 힙의 메모리 사이즈를 초과하는 문자열들이 힙의 버퍼에 할당될 시, 공격자가 데이터 변경 및 함수 주소 변경으로 임의 코드를 수행
기본적인 힙 오버플로우는 동적 메모리 할당 연결(malloc() 상위 수준 데이터)를 덮어씀으로써 프로그램 함수 포인터를 조작한다.
주로 root 소유의 setuid 프로그램이나 힙 영역 or bss에 할당된 인접한 버퍼를 사용한다.
BOF 공격 간단 요약
버퍼가 넘칠 수 있는 코드를 찾는다(BOF 취약점 찾기), return address 의 정확한 위치 찾기(return address의 정확한 위치를 찾아 ret 직전까지 의미없는 값으로 버퍼를 채운 후 우리가 원하는 코드의 주소를 ret에 넣어서 공격)
BOF에 취약한 함수
처리하는 문자열의 최대 크기를 정하지 않는 함수
BOF 주요 함수 | 설명 |
strcpy(char *dst, const char *src) | - src 문자열을 dst 버퍼에 저장 - src 문자열 길이를 체크하지 않아, dst 버퍼를 초과하는 BOF 가능 |
strncpy(char *dst, const char *src, size_t len) | - src 문자열의 len 만큼을 dst 버퍼에 저장 - src 문자열 길이를 제한하여 BOF 방지 가능 |
size_t strlen(const char *str) | - 문자열(str)의 null 문자를 제외한 바이트 수를 반환 |
sizeof(피연산자) | - 피연산자의 크기를 반환 |
외
- strcat
- gets
- fscanf
- scanf
- sprintf
- sscanf
- vfscanf
- vsprintf
- vscanf
- vsscanf
- streadd
- strtrns
bof 공격 예시
'System & Reversing 필기' 카테고리의 다른 글
DreamHack Stage2(컴퓨터 구조) (0) | 2023.05.01 |
---|---|
DreamHack Stage2( 리눅스 메모리 구조) (0) | 2023.05.01 |
x86, x64 레지스터 (0) | 2023.03.18 |
어셈블리어 명령어 정리 (0) | 2023.03.12 |
gcc 컴파일러( + .so, .a, .o, .c) (0) | 2023.03.12 |