오래 못 할 짓 하지 않기
Buffer Overflow 본문
Buffer Overflow
: 문자열에 할당된 메모리 용량보다 더 큰 공간을 할당했을 때
데이터 길이에 대한 불명확한 정의를 악용한 덮어쓰기로 인해 발생
ex) 비유하자면 학회원들한테 학회실 자리 쓰라고 함 ➡️ 인당 자리 1개 쓰리라 생각했는데 한 명이 자리 3,4개 씀
이러다간 교수님 오피스까지 쳐들어가서 앉아 있을 수도 있다.
위 그림으로 보면, 한 문자열에 4칸이 할당되었는데
들어오는 길이에 대한 제약을 두지 않아, 다른 역할을 할 e까지 문자열이 덮어쓰기 된 상태이다.
따라서 이런 상황을 방지하기 위해서는
문자열에 메모리를 얼만큼 할당해줄지 정해주는 것이다.
할당받은 메모리보다 작은 문자열을 받는다면 위와 같다.
입력받은 문자열이 다른 메모리를 침범하지 않고 모든 게 정상적으로 작동하고
스택 메모리의 시작 주소와 복귀 주소가 보관되어 있는 함수가 문제없이 종료된다.
버퍼 오버플로우로 공격을 하는 경우에는
문자열 입력에 공격코드 시작 주소를 반복적으로 넣는다.
공격코드가 실행되는 주소인 0xAABB 가 다른 메모리를 차지하고
마지막에 복귀 주소까지 공격코드 주소로 넣는다면
에러가 발생해도 프로그램은 해당 주소로 넘어가 공격 코드를 수행한다.
우리가 배웠던 프로그램 메모리 구조를 보면 이와 같다.
우리가 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
'3학년 2학기 > 컴퓨터 보안(Computer Security)' 카테고리의 다른 글
[ 컴퓨터 보안 ] 5. Buffer Overflow (0) | 2024.10.05 |
---|---|
[ 컴퓨터 보안 ] 4. Capability Leaking / Environment Variable (0) | 2024.09.10 |
[ 컴퓨터 보안 ] 3. Authentication (인증) + Set-UID 특수권한 (0) | 2024.09.06 |
[ 컴퓨터 보안 ] 2. Linux 권한 관련 (0) | 2024.09.03 |
[ 컴퓨터 보안 ] 1. Security의 개념 (0) | 2024.08.30 |