100 likes | 654 Views
포맷 스트링. 시스템보안 20072250 최영환 20072230 이완형 20072225 양해민. 목차. 포맷 스트링이란 ? 포맷 스트링 취약점은 ? 포맷 스트링 공격수행 , 공격방어 실습. 포맷 스트링이란 ?. 포맷 스트링이란 ? 포맷 스트링이란 일반적으로 사용자로부터 입력을 받아 들이거나 결과를 출력하기 위하여 사용하는 형식 .
E N D
포맷 스트링 시스템보안 20072250 최영환 20072230 이완형 20072225 양해민
목차 • 포맷 스트링이란? • 포맷 스트링 취약점은? • 포맷 스트링 공격수행, 공격방어 • 실습
포맷 스트링이란? • 포맷 스트링이란? • 포맷 스트링이란 일반적으로 사용자로부터 입력을 받아 들이거나 결과를 출력하기 위하여 사용하는 형식. • 포맷스트링 공격은 프로그램 권한을 얻을 수 있는 또 다른 공격 기법 • 버퍼 오버플로우 공격처럼 포맷 스트링 공격도 보안과 아무 관계도 없어 보이는 프로그래밍 실수를 이용한다. • 프로그래머에게 있어 다행인 것은 일단 포맷 스트링 기법을 이해하기만 하면 공격대상을 찾아내 제어하기 매우 쉽다는 것이다.
포맷 스트링 취약점 • 포맷 스트링 취약점은 이제는 흔하지 않음에도 불구하고 다음에 소개할 기법으로 여전히 공격 가능하다.
포맷 스트링 공격 • 포맷 스트링 공격은 포맷 스트링 문자를 사용하지 않고 출력함수를 사용하는 데 대한 공격으로, 버퍼 오버플로우 공격과 마찬가지로 RET 값을 변조하여 임의의 코드를 실행시킬 수 있다. • 포맷 스트링의 취약 함수 Fprintf (fp, const char *fmt, ….) Int sprintf (char *str, const char *fmt, ….) Int snprintf (char *str, size_t count, const char *fmt….)
포맷 스트리밍 공격 대응책 포맷 스트링 공격에 대한 대응책은 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 - 또다른 대응책은 시스템 패치를 꾸준히 해주는 것이다.커널이 발전하면서 SetUID에 대한 보안 설정 사항이 늘어가고 잇어 이러한 취약점을 보완해준다.
포맷스트리밍 실습 [포캣 스트링 공격 수행하기] 1’ 일반 사용자로 bugfile.c 와 eggshell.c을 컴파일 한다. 2’bugfile 을 실행해보자 입력 값을 받아 출력해주는 것을 확인할 수 있다. 여기에 AAAAAA와 함께 적당한 길이의 %x 를 입력해보자. EBP값 : bffffb68, RET: 400349cb 이라고 예측할 수 있다. • 먼저 egg쉘을 실행하자. • 이제 RET값이 있는 주소를 얻어보자.
포맷스트리밍 실습 (2) • RET위치를 확인하기 위해 0x804842b에 break 한다. 여기에서 400349cb가 RET값인데 0xbffff13c 이곳이 RET를 가리키는 주소다. 그러므로 이곳을 egg쉘 값 0xbffffb18로 고치면 셀을 따 낼수 있다. 3’ 관리자 권한으로 bugfile 를 root 소유 파일로 바꾸고 SetUID를 걸어주자. 4; 이제 egg쉘 값을 10진수로 바꿔보자. 1bfff : 114687 fb18 : 64280 이다. 여기서 bffff13c부터 bffff13f까지 4바이트를 바꿔야하므로 앞에 값은 64280-16=64264 뒤에 값은 114687-64264-16=50407이다.
포맷스트리밍 실습 (3) 엔터키를 몇번 누른다음, 명령을 입력해 보자. 포맷스트링 공격이 성공하였다........