이 글은 포스텍 김종 교수님의 컴퓨터SW시스템개론(CSED211) 강의를 기반으로 재구성한 것입니다.
이 글에서는 buffer overflow에 대해 알아본다.
Buffer Overflow
정의
Calling Convention 게시글에서 어떤 procedure P가 procedure Q를 호출할 때 return address를 stack에 push한다고 했다. 그러나 입력 범위보다 더 큰 값이 입력되는 등 특정한 상황에서 return address가 다른 값으로 변경될 수 있다. return address가 위치해 있는 assembly는 무조건 실행되기 때문에 segmentation fault가 나거나, 또는 사용자가 원하는 instruction을 실행시킬 수도 있다.
이처럼 데이터의 크기가 할당된 범위보다 더 클 때 원래 입력되어 있던 값들이 오염되는 현상을 buffer overflow라 한다.
예방법
buffer overflow는 사용자가 원하는 코드를 실행시킬 수 있기 때문에 매우 치명적이기 때문에 프로그램을 짤 때 유의해야 한다. buffer overflow를 막는 방법은 다음과 같다.
- stack canari 사용 : 특정 data를 return address 다음 stack에 집어넣어 이 값이 바뀌지 않았을 때만 코드를 계속 실행하는 방법.
- safe function 사용 : string 입력 시 길이 제한을 두는 방법. gets() 대신 fgets()를 쓰면 된다.
- non-executable code segment ; 각 memory section에 control bit를 추가해 data section code를 readonly로 바꾸어 코드를 실행 불가능하게 만드는 방법.
- randomized stack offset : stack의 시작 주소를 randomized해 return address를 바꾸지 못하게 하는 방법.
'CS > OS' 카테고리의 다른 글
[컴퓨터 SW] Cache와 Locality (0) | 2023.06.15 |
---|---|
[컴퓨터 SW] Storage - RAM & Disk (0) | 2023.06.14 |
[컴퓨터 SW] Array/Structure/Union의 할당과 접근 (0) | 2023.06.11 |
[컴퓨터 SW] Calling Convention (0) | 2023.06.10 |
[컴퓨터 SW] Byte Ordering (0) | 2023.06.08 |