형식 문자열 공격

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 찾기

형식 문자열 공격(format string attack)은 c언어의 라이브러리 함수인 printf계열의 함수들을 사용하는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점이다. 이 취약점을 통해 악의적인 공격자가 원하는 위치의 메모리값을 덮어쓸 수 있다. 덮어 쓰여 질 수 있는 데이터에는 프로그램 변수와 프로그램 흐름 제어 데이터도 포함된다. 이로 인해 잘못된 프로그램 거동이 나타날 수 있으며, 메모리 접근 오류, 잘못된 결과, 프로그램 종료, 또는 시스템 보안 누설이 발생할 수 있다.

형식 문자열 공격은 printf계열의 함수를 사용시 문자열을 인자로 바로 넘겨서 출력 하게끔 하지 않고 포맷스트링 %s를 사용해서 문자열을 출력하도록 하면 방지 할 수 있다.

목차

기술적인 설명 [편집]

형식 문자열 공격은 공격자가 printf계열의 함수에 전달되는 포맷 스트링을 임의로 바꿀 수 있는경우 공격이 가능해진다.

기본 예제 [편집]

/* vulnerabe.c */
 
#include <stdio.h>
 
int main ( void )
{
    char str [ 128 ] ;
 
    fgets ( str , 128 , stdin ) ;
    printf ( str ) ;
 
    return 0 ;
}

프로그래머의 의도는 입력받은 문자열을 출력하도록 하는 것이겠지만 포맷 스트링을 통해 메모리를 덮어 쓸 수 있다. 포맷 스트링 중 %n은 대응 되는 인자에 해당하는 주소값에 여태까지 출력한 문자수를 계산해서 값을 쓴다.

이를 이용해 스택에 셸코드를 넣어 두고 스택 프레임안의 귀환 주소 또는 ELF의 .dtors섹션을 셸코드의 주소로 덮어쓰거나, 라이브러리 함수의 주소를 덮어써서 프로그램의 실행 흐름을 제어 할 수 있다. 함수 포인터를 덮어쓴다던가 예외 처리기 (exception handler)를 덮어 써서 실행 흐름을 제어 할 수도 있다.

이용당하는 것을 막는 방법 [편집]

/* invulnerabe.c */
 
#include <stdio.h>
 
int main ( void )
{
    char str [ 128 ] ;
 
    fgets ( str , 128 , stdin ) ;
    printf ( "%s" , str ) ;
 
    return 0 ;
}

단지 포맷 스트링 %s를 통해 문자열을 출력 하는 것으로 악의적인 공격을 막을 수 있다.

같이 보기 [편집]

참조 [편집]