ch@e
Published 2023. 3. 18. 23:30
BoF System & Reversing 필기

 

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 공격 예시

https://yehey-study.tistory.com/entry/%EB%B2%84%ED%8D%BC-%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C%EC%9A%B0-BOF-Buffer-OverFlow

profile

ch@e

@ch@e

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그