반응형
포맷 스트링 버그
- 포맷 스트링 버그(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);
- 명확하게 정의되었던 데이터가 불명확해진 것 [본문으로]
반응형
'공부 > 정보보안' 카테고리의 다른 글
버퍼 오버플로(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 |
댓글