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를 방지할 수 있다
'정보보안' 카테고리의 다른 글
[정보보안] ChatGPT를 조심하세요! (0) | 2023.08.17 |
---|---|
[정보보안] 내가 접속한 사이트를 의심해봐야 하는 이유 (0) | 2023.08.17 |
[정보보안]시스템해킹 (0) | 2023.06.15 |
[정보보안] sql Injection (0) | 2023.06.15 |
[정보보안] CSRF 공격하기 (0) | 2023.06.15 |