티스토리 뷰

카테고리 없음

Buffer overflow 란?

기루광 2021. 12. 27. 00:34

Buffer overflow 란,  고정된 메모리 버퍼를 넘어서 접근해야 되지 않을 주소, 메모리 공간까지 넘어가 그 곳의 정보를 수정하거나 덮어쓰게 되는 것입니다.  덮어쓰는 내용을 특정 코드를 실행하도록 덮어 씌우는 공격이 바로 buffer overflow 공격입니다.

먼저 메모리 Stack 에 대한 내용을 알아야 될 것 같아 간단히 그림을 그려봅니다.

Process Memory

  1. heap
     malloc, new 할당 동적 데이터
  2. stack
     전역 변수, 콜Stack(함수 파라미터 / 리턴 어드레스)
  3. data(global variabels)
    - uninitialized data
    - initialized data
  4. code(or text)
     프로그램 기계어 코드가 올라가는 영역

 

우리가 실행하는 Process 의 메모리 구조를 보면 1개의 Process는 1개의 stack 과 1개 이상의 heap을 가질 수 있습니다. BOF(Buffer Over Flow) 공격은 여기에서 stack 영역 중 Return Address 를 변경하여 메모리 내 특정 코드가 실행되도록 하는 공격 방법입니다.

 

<메모리 구조>

 

 실제 buffer overflow를 하기위해서는 scanf, strcpy, strcat 등 메모리를 조작하는 모든 함수를 통해서 가능합니다. 결론 부터 말씀드리면 *_s 함수를 통하면 buffer over flow 가 일어날 수 있는 일들을 원천 차단할 수 있습니다.

 코드를 예로 들어 자세히 설명 드리면 sniper() 함수를 전혀 실행될 수 없지만, 이를 실행 할 수있도록 메모리를 변조해보도록 하겠습니다. 아래 코드는 단순히 subroutine 을 실행하고 subroutine 안에서 scanf 를 통해 입력받고 종료되는 코드입니다.

#include <stdio.h>
#include <stdlib.h>

int buf[4];
// 특정 메모리에 올라온 함수를 실행하는 방법
void sniper() {
	system("dir");
}

void subroutine(int param) {
	// buffer overflow 공격 지점
	scanf("%s", buf);
}

int main() {
	printf("SNIPER ADDRESS=[Ox%p]\n", sniper);
	subroutine(4);

	return 0;
}

 

Windows 에서 수행하기위해 Visual Studio  의 디버그-창-디스어셈블리 를 체크하고, subroutine 함수 수행 전 break point 를 지정하여 레지스터창을 이용하면 아래와 같이 어셈블리 코드를 확인 할 수 있습니다.

 

 

여기서 중요한 것은 레지스터 창의 ESP(Stack Pointer)의 주소를 디버그-창-메모리 를 이용하여 step 별로 함수에 진입하는 상태를 보면 먼저 파라미터 4를 stack 넣고, 그 다음 함수가 끝나고 돌아올 주소 즉, return address 를 stack 에 넣는 다는 것을 알 수 있습니다.

 

 Buffo overflow 공격은 바로 stack 에 있는 return address를 변경하여 원하는 함수를 실행하여 공격하는게 목표 입니다. 간단히 return address를 원하는 함수 (sniper 함수 주소)로 변경하면 어떤 일이  생기는지 확인 해 보도록 하겠습니다.

Stack 내 Return Address 변경

 

함수가 정상적으로 종료되지는 않았지만, system("dir") 이란 sniper 함수가 수행되었음을 알 수 있습니다.

최종 dir cmd 가 실행되는 결과

 

이제 남은 일은 buffer overflow 를 통해 return address 를 특정함수 (sniper ) 주소로 바꾸는 일만 남게 되었습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함