포맷 스트링 공격(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값을 악성코드가 위치한 주소로 변조가능하여 취약한 것이다.
따라서 포맷스트링 식별자를 프로그램에서 지정해야지 사용자가 지정하지 못하게 해야한다.