본문 바로가기
공부/정보보안

포맷 스트링 버그(format string bug)

by Skogkatt의 개인 블로그 2020. 2. 17.
반응형

포맷 스트링 버그

  • 포맷 스트링 버그(format string bug)는 printf 등의 함수에서 문자열 입력 포맷을 잘못된 형태로 입력하는 경우 나타나는 버그이다.
  • 보안 취약점으로 포맷 스트링 익스플로잇은 프로그램을 충돌시키거나 악의적인 코드를 실행시키는 데 사용될 수 있다.
  • 버퍼 오버플로 공격에 비해 취약점을 쉽게 찾아낼 수 있고 사전에 완전한 예방이 가능하다.

서식 지정자(Format specifier)

C언어의 대표적인 서식 지정자
  • %d : 정수형 10진수
  • %f, lf : 실수
  • %c : 문자 하나(char)
  • %s : 문자열(char[])
  • %u : 10진수
  • %o : 8진수
  • %x : 16진수(소문자)
  • %x : 16진수(대문자)
  • %n : 쓰인 총 바이트 수

포맷 스트링 공격

포맷 스트링 버그는 데이터의 형태와 길이에 대한 불명확한 정의로 인한 문제점 중 '데이터 형태'에 대한 불명확한 정의로 발생한 것이다.

#include <stdio.h>

int main(void){
  char str[10] = "skogkatt";
  printf("%s", str);
  return 0;

# skogkatt

str를 문자열(%s)로 인식해 출력하는 간단한 코드이다.

이는 정상적인 경우로 포맷 스트링에 의한 취약점은 발생하지 않는다.

#include <stdio.h>

int main(void){
  char str[10] = "skogkatt";
  printf(str);
  return 0;

# skogkatt

이 코드 또한 실행 결과 자체는 똑같지만 printf부분의 str은 문자열이 아니라 서식 지정자를 포함한 포맷 스트링으로 인식된다.[각주:1]

 

  • 서식 지정자가 제대로 입력된 첫번째 코드의 경우 서식 지정자의 개수만큼 인자들이 스택에서 추출된다.
  • 서식 지정자가 재대로 입력되지 않은 두번째 코드의 경우 입력에 따라 서식 지정자의 수가 달리질 수 있게 되어 악의적으로 지정자 수를 조작하여 스택의 내용을 확인할 수 있다.

포맷 스트링 공격의 위협요소

프로그램 다운
프로세스 메모리/스택 확인
임의의 메모리 접근

포맷 스트링 공격 예방

포맷 스트링 공격 취약점을 가진 함수 
  • fprintf(fp, 서식 문자열, 인자1, 인자2 ...) : 결과를 해당 파일로 출력하는 함수
  • sprintf(char *str, const char *fmt...) : 결과를 문자열로 출력
  • snprintf(char *str, size_t count, const char *fmt) : snprintf 함수에서 복사될 문자열의 크기를 지정할 수 있는 함수
  • sprintf
  • System V : vprintf, vprintf, vsprint, vsnprintf
printf 등에서 입력받은 값을 사용할 때 서식 지정자 사용
# O
char str[10] = "skogkatt"; 	
printf("%s", str);

# X
char str[10] = "skogkatt";
printf(str);

 

  1. 명확하게 정의되었던 데이터가 불명확해진 것 [본문으로]
반응형

'공부 > 정보보안' 카테고리의 다른 글

버퍼 오버플로(buffer overflow)  (0) 2020.02.15
제로 트러스트 보안 모델  (0) 2020.02.03
[DVWA] File Upload  (0) 2019.11.27
[DVWA] CSP Bypass  (0) 2019.11.25
[Wargame.kr] QR CODE PUZZLE 문제  (0) 2019.09.23

댓글