Security and Programming

Slides:



Advertisements
Similar presentations
SCJP. Garbage Collection  Garbage Collector( 이하 GC) 가 Heap 영역 에 할당된, 더 이상 사용되지 않는 메모리인 Garbage 를 다른 객체가 사용할 수 있도록 정리하는 것.  C++ 에서의 메모리 해제 int* v=new.
Advertisements

Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
Basic of Buffer Over Flow
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제14장 동적 메모리.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기
제 9 장 구조체와 공용체.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
Lecture 5 C의 기초적인 값(primitive value)의 컴퓨터에서의 표현 문자, 정수, 실수, 참/거짓
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
버퍼 오버플로우 시스템보안 류기환 권재홍.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
5장. 참조 타입.
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
제 3장. C보다 나은 C++ II.
C 프로그래밍.
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
6장. printf와 scanf 함수에 대한 고찰
TCP/IP Socket Programming…
14장. 포인터와 함수에 대한 이해.
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
C#.
C 2장. C 프로그램 시작하기 #include <stdio.h> int main(void) { int num;
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
Chap 6.Assembler 유건우.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
C 3장. 변수와 데이터형 #include <stdio.h> int main(void) { int num;
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
Fucntion 요약.
Canary value 스택 가드(Stack Guard).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
7주차: Functions and Arrays
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
제 4 장 Record.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
윈도우에서의 유니코드.
13. 포인터와 배열! 함께 이해하기.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Security and Programming [ Overflow ] Security and Programming SSM_14th 김광철

Agenda What is the Overflow? Stack Overflow Heap Overflow Integer Overflow Writing Secure code

What is the Overflow Overflow 사전적 의미 : 넘치다, 범람 컴퓨터 분야에서의 의미 제한된 크기를 지닌 저장공간에 그 크기 보다 큰 데이터가 입력되는 것을 의미 결과적으로 프로그램의 오동작의 원인 변수의 크기는 인간의 판단으로 충분하다고 생각하는 크기 Underflow는 반대되는 의미로서 포맷스트링 버그라고도 함.

What is the Overflow 종류 Stack Overflow Heap Overflow Frame pointer Overflow Integer Overflow

What is the Overflow Overflow의 위험성 Overflow는 프로그램의 오동작을 유발한다. 임의의 사용자에게 관리 권한이 노출됨 Overflow는 탐지가 어렵다.(현재까지 탐지하는 방법은 거의 없음) Exploit, 바이러스 및 웜 등의 침입방법으로서 사용됨 ex) Blaster worm : RPC의 버퍼 오버플로우 이용 –MS 보안 게시판 MS03-026 참조

Stack Overflow Backgrounds Process의 메모리 구조 Stack text lower memory address Backgrounds Process의 메모리 구조 Stack LIFO(Last In First Out) PUSH/POP procedure, function call SP, FP (Stack Pointer, Frame Pointer Local variables, return address, previous stack frame, and etc text data stack higher memory address

Stack Overflow Stack overflow의 근본적 원인 Stack Overflow Simple Example C 언어는 bound check를 잘 하지 않는다. ex) gets(), strcpy(), strcat(), getc(), etc 최근에 오면서 리눅스에서도 알 수 있듯이 Open source를 지향하고 있다. Stack Overflow Simple Example str ret sfp buffer void function(char *str) { char buffer[8]; strcpy(buffer,str); }

Heap Overflow Heap Program 실행시 동적으로 할당되는 메모리 영역 – 실행시 크기가 결정되는 가변적 데이터 저장 용도로 사용 C - malloc()에 의해 할당되는 영역 할당되고 해제 된 영역은 Garbage Collector 와 같은 것에 의해 정리됨. Stack과 저장공간의 특성이 다를 뿐 Overflow 원리는 비슷 heap1 none heap2 heap3

Frame pointer Overflow Buffer Overflow의 한종류 1byte overflow에 의한 FP(frame pointer) 변경에 의해 프로그램의 실행 흐름이 변경될 수 있다.

……………………………………………………….. Integer Overflow 정수란 ? 분수형으로 나타내지 않을 수 있는 실제적인 수 정수형 또한 다른 변수들과 마찬가지로 메모리 상의 한 부분이다. 양수 음수를 표현하기 위한 방법이 필요 * 첫비트를 부호 비트로 사용 일반적으로 32bit(4bytes)의 크기를 갖는다. ……………………………………………………….. 첫 비트 int에서는 부호비트, unsigned int에서는 부호비트가 아니다.

Integer Overflow 정수형의 종류 Integer Overflow의 위험성 int, unsigned int, short, usigned short…. Integer Overflow의 위험성 발생한 후에 알아차릴 수 없다. 발견하기 어려워서 잘짜여진 에러 검사 코드도 피해갈 수 있다. Integer overflow의 경우 프로그램 수행결과가 올바른지 알 수 없다. –올바르다고 가정하고 진행된다.

Integer Overflow Widthness overflows Arithmetic overflows 변수가 저장하려는 값보다 작을 때 발생 Arithmetic overflows 변수에 저장하려는 연산의 결과값이 변수의 크기보다 클 때 발생

Integer Overflow Widthness overflows /* ex1.c - loss of precision */ #include <stdio.h> int main(void){ int l; short s; char c; l = 0xdeadbeef; s = l; c = l; printf("l = 0x%x (%d bits)\n", l, sizeof(l) * 8); printf("s = 0x%x (%d bits)\n", s, sizeof(s) * 8); printf("c = 0x%x (%d bits)\n", c, sizeof(c) * 8); return 0; } /* EOF */

l = 0xdeadbeef (32 bits) s = 0xffffbeef (16 bits) c = 0xffffffef (8 bits)

Integer Overflow Arithmetic overflows /* ex2.c - an integer overflow */ #include <stdio.h> int main(void){ unsigned int num = 0xffffffff; printf("num is %d bits long\n", sizeof(num) * 8); printf("num = 0x%x\n", num); printf("num + 1 = 0x%x\n", num + 1); return 0; } /* EOF */ num is 32 bits long num = 0xffffffff num + 1 = 0x0

Integer Overflow Arithmetic overflow 를 이용한 exploit에 사용 int myfunction(int *array, int len){ int *myarray, i; myarray = malloc(len * sizeof(int)); /* [1] */ if(myarray == NULL){ return -1; } for(i = 0; i < len; i++){ /* [2] */ myarray[i] = array[i]; return myarray;

Integer Overflow Signedness bugs unsigned ~> signed,signed~> unsigned Signed 형 정수가 비교문에서 사용될때 Signed 형 정수가 연산에서 사용될때 Unsigned형 정수가 signed형 정수를 비교할때 int copy_something(char *buf, int len){ char kbuf[800]; if(len > sizeof(kbuf)){ /* [1] */ return -1; } return memcpy(kbuf, buf, len); /* [2] */

Integer Overflow signed형 버그는 정수형 오버플로우에 의해 일어난다.

Writing Secure Code Overflow를 어떻게 방지할 것인가? 잘 코딩하라!!! 외부에서 입력되는 데이터를 신용하지 마라. C를 사용할 경우 bound check를 하지 않는 함수의 사용을 자제한다. ex) strcpy, strcat, getc…. Etc. 안전한 문자열의 전송은 길이를 같이 전송하는 것이다. compiler의 옵션 사용

Writing Secure code Overflow를 완벽히 막는다는 것은 현재로선 거의 불가능하다. Visual C++.Net 의 /GS option 스택에 선언되는 로컬 변수와 ebp 포인터, 리턴 주소와 해당 함수의 오류 처리 루틴을 서로 검증하는 새로운 컴파일러 옵션 gcc의 StackGuard 와 유사 그러나 모든 overflow를 검출하지는 못한다. - heap overflow

Writing Secure Code C언어를 사용할 경우 bound check를 하지 않은 strcpy, gets, strcat 같은 함수를 사용하지 않거나 사용해야 할 경우 길이 체크를 반드시 한다. 변수의 타입 선언시 용도의 범위(scope)에 맞게 선언하고 scope 검사도 같이 병행해야 한다.

Conclusion 안전하지 못한 함수 호출 금지 코드 리뷰 철저한 테스트 소스 코드 스캐닝 툴 가장 좋은 것은 안전하고 견실한 잘 짜여진 프로그램 코드이다.

Appendix References phrack-55-8 phrack-60-10 phrack-55-15 phrack-49-14 Corezine-1-1 Writing Secure code 2nd [정보문화사]