궁금한게 많은 열아홉
Published 2023. 6. 15. 14:51
[정보보안] bof 정보보안

Buffer Overflow

데이터를 버퍼에 저장할 때 개발자가 의도한 크기를 넘어서 값을 넣는 방식이다.
그럼 버퍼 데이터가 초과하고, 초과된 데이터는 인접 메모리에 영향을 미친다.
이때 제어 관련 구문도 포함될 수 있다.
프로그램의 실행 흐름을 바꿔 특정 코드가 실행되게 한다.

해결 방안

  • 입력 값의 타입 확인
  • 입력 값의 길이 확인
 

용어 정리

Stack Frame

모든 함수가 호출될 때 할당되는 자신만의 스택 공간이다.

SFP: Stack Frame Pointer

이전 함수의 Stack Frame Pointer를 저장하는 영역이다.
Stack Pointer의 기준점이 된다.

SP: Stack Pointer

SFP를 기준점으로 해서, 상대 주소 offset 을 저장해 메모리에 접근한다.

RET: Return Address

이전 함수의 다음 실행 명령어 주소를 저장하는 영역이다.

EBP Register

현재 실행중인 함수의 SFP를 저장한다.

ESP Register

SP를 저장한다.

EIP Register

RET를 저장한다.
 

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)

  • 문자열(src)의 null 문자를 제외한 바이트 수를 반환한다.

sizeof(피연산자)

  • 피연산자의 크기를 반환한다.

 

방지하는 방법

strncpy 함수를 다음과 같이 사용한다.
strncpy(buffer, argv[1], sizeof(buffer)-1);
입력 문자열이 버퍼의 크기와 같거나 클 시,
프로그램을 종료하는 방식으로도 BOF를 방지할 수 있다

 

profile

궁금한게 많은 열아홉

@jjin502

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