티스토리 뷰
[ 목차 ]
스택 오버플로우
(가) 개요
① 스택 버퍼 오버플로우 공격은 보통 SetUID(Set User ID)가 설정된 루트 권한의 프로그램을 공격대상으로 한다. 스택
에 정해진 버퍼보다 큰 공격 코드를 삽입하여 반환주소를 변경함으로써 임의의 공격 코드를 루트 권한으로 실행하도
록 하는 방법이다.
② 스택 버퍼 오버플로우는 1988년 모리스 인터넷 웜에서 처음 발견된 이후 계속 이용되어 왔다. 이것은 fingerd 데몬에
서 사용한 gets() 함수의 검사되지 않은 버퍼 오버플로우를 이용하였다.
(나) 셸코드
① 많은 버퍼 오버플로우 공격의 핵심 요소는 오버플로우가 발생하는 버퍼에 저장되는 공격자의 코드로 실행 제어를 이
동시키는 것이다. 이 코드를 셸코드(shellcode)라고 한다.
② 이렇게 부르는 이유는 사용자 명령어 라인의 해석기인 셸로 제어를 넘기고 공격당한 프로그램의 권한으로 시스템의
다른 프로그램에 접근하기 때문이다.
(다) 스택 버퍼 오버플로우 공격 절차
① 1단계 : 공격 셸 코드를 버퍼에 저장한다.
② 2단계 : 루트 권한으로 실행되는 프로그램의 특정 함수의 스택 반환주소 버퍼를 오버플로우시켜서 공격 셸 코드가
저장되어 있는 버퍼의 주소를 덮어씌운다.
③ 3단계 : 특정 함수의 호출이 완료되면 조작된 반환 주소로 셸 코드의 주소가 반환되어 셸 코드가 실행되고, 루트 권한
을 획득하게 된다.
힙 오버플로우(heap overflow)
(가) 개요
① 일반적으로 힙은 프로그램과 전역 데이터 위에 위치하며 메모리 위 방향으로 커진다.(스택은 아래 방향으로 커진다.)
② 힙에 요청되는 메모리는 레코드의 연결리스트와 같은 동적 데이터 구조를 위해 사용된다. 만약 이런 레코드가 오버플
로우에 취약한 버퍼를 가지고 있다면 연속된 메모리가 손상될 수 있다.
③ 스택과는 다르게 실행 제어를 쉽게 이동시킬 수 있는 반환 주소는 없다. 그러나 할당된 공간이 함수에 대한 포인터를
포함하고 있다면 공격자는 이 주소를 변경하여 겹쳐 쓴 버퍼에 있는 셸코드를 가리키도록 할 수 있다.