오래 못 할 짓 하지 않기

Buffer Overflow 본문

3학년 2학기/컴퓨터 보안(Computer Security)

Buffer Overflow

쫑알bot 2024. 8. 14. 13:04
728x90

Buffer Overflow

: 문자열에 할당된 메모리 용량보다 더 큰 공간을 할당했을 때

데이터 길이에 대한 불명확한 정의를 악용한 덮어쓰기로 인해 발생

 

ex) 비유하자면 학회원들한테 학회실 자리 쓰라고 함 ➡️ 인당 자리 1개 쓰리라 생각했는데 한 명이 자리 3,4개 씀

       이러다간 교수님 오피스까지 쳐들어가서 앉아 있을 수도 있다.

 

https://copycode.tistory.com/92

 

위 그림으로 보면, 한 문자열에 4칸이 할당되었는데

들어오는 길이에 대한 제약을 두지 않아, 다른 역할을 할 e까지 문자열이 덮어쓰기 된 상태이다.

 

따라서 이런 상황을 방지하기 위해서는

문자열에 메모리를 얼만큼 할당해줄지 정해주는 것이다.

 

https://m.blog.naver.com/copodog/222059743869

 


 

할당받은 메모리보다 작은 문자열을 받는다면 위와 같다.

입력받은 문자열이 다른 메모리를 침범하지 않고 모든 게 정상적으로 작동하고

 

스택 메모리의 시작 주소와 복귀 주소가 보관되어 있는 함수가 문제없이 종료된다.

 

 

 

버퍼 오버플로우로 공격을 하는 경우에는

문자열 입력에 공격코드 시작 주소를 반복적으로 넣는다.

 

공격코드가 실행되는 주소인 0xAABB 가 다른 메모리를 차지하고

마지막에 복귀 주소까지 공격코드 주소로 넣는다면

 

에러가 발생해도 프로그램은 해당 주소로 넘어가 공격 코드를 수행한다.

 

 


 

우리가 배웠던 프로그램 메모리 구조를 보면 이와 같다.

 

https://zangzangs.tistory.com/107

 

우리가 data에 문자열을 넣으면 그 값들만 들어가야 하는 건데

버퍼 오버 플로우 같은 경우에는 

 

 

 

이렇게 되고, 다른 데이터 저장 공간에 

                   해당 문자열에 있는 값을 주소로 인식하여 돌아가려고 하는 것이다.

 

 


 

버퍼 오버플로우 대응 방법

1. ASLR ( 주소 공간 배치 난수화 )

2. Stack Guard ( 스택 가드 )

3. Stack Shild ( 스택 쉴드 )

 

 

ASLR ( 주소 공간 배치 난수화 )
Address Space Layout Randomization

: 메모리 공격을 방어하기 위해 주소 공간 배치를 난수화하는 기법

즉, 공격자가 특정 주소를 불러오는 것을 방지하여 악성코드 실행을 차단한다.

 

= 프로세스 주요 데이터 영역의 주소 공간 위치를 무작위로 재배치한다.

 

 

이 공격의 핵심은 실행 코드의 정확한 위치를 알고 있어야 한다.

 

일반적인 공격의 형태는 다음과 같다.

 

이렇게 되기 위해서는 복귀 주소를 받는 곳의 위치를 정확히 알고있어야 한다.

하지만 주소 공간을 무작위로 한다면 ?

 

이렇게 문자열에 있는 주소를 피할 수 있기 때문에

주소 영역에 문자열이 걸쳐 들어온다 해도 정확한 주소로 보낼 수 없기 때문에

공격을 막을 수 있다.

 

 


Stack Guard ( 스택 가드 )

: 복귀 주소 근처에 "CANARY(카나리아)" 라는 특수한 문자열을 넣고

 CANARY에 변조가 발생할 경우 프로그램을 종료시킨다.

 

ex) 데스노트에서 자신의 방에 누가 들어왔는지 알려고 문지방에 샤프심을 두고

집에 들어올 때 이게 부숴져있는지 봄.

그 샤프심 역할이 CANARY라고 생각하면 된다.

 

 


Stack Shield ( 스택 쉴드 )

함수 시작 시에 복귀 주소 Return Address를 Global RET에 저장한다.

 

함수 종료 시에 [ Global RET의 값 ] 과 [ 현재 스택의 RET 값 ] 을 비교

다를 경우에 오버 플로우로 판단하여 프로그램 실행 종료

 

 


이 외에도 

 

- 버퍼가 저장할 수 있는 크기보다 많은 데이터를 입력받지 않는다.

- 버퍼 밖의 메모리 영역을 참조하지 않는다.

 

등이 있다.

 

 

 

 

(출처)

 

https://www.cloudflare.com/ko-kr/learning/security/threats/buffer-overflow/

 

https://m.blog.naver.com/copodog/222059743869