본문 바로가기

카테고리 없음

정보보안기사 _ 8일차 _ 시스템 기본 학습 _ 시스템 해킹(포맷 스트링)

포맷 스트링 공격(Format String Attack)

 

포맷 스트링은 C언어의 printf()등의 함수에서 사용되는 문자열의 입출력 형태를 정의하는 문자열로 서식문자열이라 함

포맷 스트링을 인자로 하는 함수의 취약점을 이용한 공격으로, 외부로부터 입력된 값을 검증하지 않고 입출력 함수의 포맷 스트링을 그대로 사용하는 경우 발생할 수 있는 취약점임.(하나하나 주옥같다 단어가)

공격자는 포맷 스트링을 이용하여 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있어서 그 결과 공격자는 취약한 프로세스의 권한을 획득하여 임의의 코드를 실행할 수 있다. ( 오 어떻게??)

 

공격 원리가 되는 함수들

printf(서식문자열, 인자1 ... 인자N) : 인자값을 포맷 스트링으로 표준 출력

tprintf(fp, 서식문자열, 인자1 ... 인자N) : 인자값을 포맷스트링으로 지정한 파일에 출력

sprintf(buf, 서식문자열, 인자1 ... 인자N) : 인자값을 포맷스트링으로 지정한 버퍼에 출력

 

포맷 스트링 식별자(코딩 안한지 오래되었으니 다시 외우고 짚고 가기)

%d 10진수 정수 출력

%f 실수(float) 출력

%c 문자 출력

%s 문자열 출력

%x 16진수 정수 출력

%n 이전까지 출력한 총 바이트 수를 지정한 변수(4바이트 단위)에 저장

%hn 2바이트 단위로 저장

 

이게 왜 공격이 되는지 솔직히는 잘 모르겠음

그래도 내 언어로 표현해보면

 

포맷스트링을 인자로 하는 함수를 사용하면서 포맷스트링을 함수의 입력 파라미터로 직접 사용하면

사용자가 입력을 통해서 포맷스트링을 결정할 수 있게 되고

공격자는 이를 조작해서 메모리 내용을 참고해 특정 영역의 값을 변경시킬 수 있다.

그래서 RET값을 악성코드가 위치한 주소로 변조가능하여 취약한 것이다.

따라서 포맷스트링 식별자를 프로그램에서 지정해야지 사용자가 지정하지 못하게 해야한다.