티스토리 뷰

버퍼 오버플로우는 가장 흔한 타입의 메모리 버그이다. 


os에 따라서 프로세스는 메모리에 다양하게 배치될 수 있지만 공통점이 있다. 


1. 모든 프로세스는 실행 가능한 프로그램 명령을 포함한다. 

2. 프로그램은 전역 변수와 정적 변수를 포함한다. 또한 동적 메모리인 힙이 있다. 

3. 스택이 존재한다. 


이는 버퍼의 위치에 따라서 버퍼 오버플로우 취약점의 영향력이 다양해 질 수 있다는 것을 보여준다. 


스택 버퍼 오버플로우 


스택 오버플로우는 스택이 위치하는 목적지 퍼버에서 발생되는 오버플로우다. 

모든 프로세스는 스택이라고 불리는 런타임 스택을 가지고 있다. 프로세서는 스택의 맨 위를 가리키는 레지스터가 있으며

그 값은 push와 pop 을 통해 변경된다. 인텔에서는 이러한 레지스터는 esp라고 부른다. 최근 cpu들은 스택이 높은 주소부터 시작해서 낮은 주소로 증가된다. 즉 push는 포인터의 값을 감소시켜서 프로세스의 낮은 주소로 이동하게 만든다. 함수가 호출될 때 프로그램은 새로운 스택 프레임을 만드는데 이 것은 함수가 내부 상태 정보를 저장하는데 사용되는 연속적인 메모리 예약 공간이다. 스택 프레임은 함수가 호출될 수록 위로 쌓인다. 




B의 경우 A가 호출한 함수이고 따라서 B가 종료되면 A가 호출된다. 지역 변수는 함수가 필요할 때 바로바로 직접 접근이 가능하야하기 때문에 push와 pop으로는 부족하다. 그래서 EBP를 추가로 사용한다. 이 레지스터는 스택 프레임의 시작점을 나타낸다. 내부 상태 정보는 각 스택 프레임에 저장된다. 그리고 보통 이전 함수의 프레임 포인터와 리턴 주소를 포함한다.  


push ebp

mov ebp,esp


위의 명령어는 함수의 전형적인 예인데 먼저 ebp를 push해서 예전 ebp를 저장해놓고 esp를 ebp에 넣어서 새로운 스택프레임을 이전 프레임 위에 쌓는다. 스택에 쌓는 순서는 다음과 같다. 먼저 매개변수를 push한다 그리고 call을 하면 리턴했을 때의 eip을 저장한다 그리고 push ebp 로 인해서 스택에 현재의 epb가 들어가며 그 다음부터 지역변수가 들어간다. 




그리고 이점을 이용해서 버퍼에 데이터를 넣으면 리턴 주소 변조가 가능하다. 그리고 리턴 주소 변경 같은 것을 이용해서 system() 을 실행시킨다. 







'시스템 보안 > 취약점' 카테고리의 다른 글

off by one 에러  (0) 2016.09.26
SEH overwrite 공격  (0) 2016.09.26
Internet Explorer epm(Enhanced Protected Mode) 이란?  (0) 2016.09.25
2 취약점 발견 방법  (0) 2016.09.25
1 취약점 발견 방법  (0) 2016.09.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함