Format String Bug (FSB)

FR33CHICKEN ㅣ 2024. 9. 22. 23:23

728x90

Format String이란

printf() 와 같은 함수등에서, 문자열의 서식을 지정하는 문자열을 의미한다.

Parameter 변수 형식
%d 정수형 10진수 상수(integer)
%f 실수형 상수(float)
%lf 실수형 상수(double)
%c 문자 값(char)
%s 문자열
%u 양의 정수(10진수)
%o 양의 정수(8진수)
%p 포인터 출력(16진수)
%x 양의 정수(16진수)
%n *int(쓰인 총 바이트 수)를 저장 
더 쉽게 설명하자면 앞에서 나온 값들을 바이트로 전환했을 때의 갯수
%hn %n의 반인 2바이트 단위로 저장
쉽게 설명하자면 %hn = %n / 2 

 

왜 발생하는가?

%n %d %c 등과 같은 형식지정자(Format String)의 잘못된 사용에서 발생한다. Format String에 대응되는 인자의 개수가 부족하거나, Format String을 사용하는 함수에서 Format String을 고려하지 않고 인자를 구성하는 경우 발생한다.

 

발생하면 뭐 어쩌라구?

요즘 시스템에서 발견되는 빈도는 매우 줄었지만, 식별될 경우 LPE 혹은 RCE로 이어질 가능성이 높다.

Memory Disclosure(메모리 주소의 유출)이나 특정 주소의 데이터 읽기 및 쓰기가 가능하다.

ㅈ 된다고 보면 된다. 

 

이 취약점은 어떻게 발생하는가?

ex1)

#include <stdio.h>

int main() {
	char *str1 = "Hello";
    char *str2 = "world";
    printf("%s %s\n"); <<< 여기 보세요 
    return 0;
}

printf("%s %s\n");

이 코드를 보면 %s에 전달할 인자가 없다.

지역변수나 전역변수나 특정 인자나 그러한 값이 무조건 형식 지정자에 값을 전달해줘야하는데 없다.

그럼 어떠한 값이 전달이 되려나?

 

그림과 같은 순서대로 메모리가 들어가야하는데 현재 우리는 두번째 세번째에는 인자가 없다??

 

printf()함수에 브레이크 포인트를 생성하고, 현재 스택 인자(esp)를 확인해본다.

왼쪽 메모리 공간(가장 낮은 주소)부터 하나씩 보면 인자에 Dummy 데이터가 존재하는 것을 볼 수 있다.

근데 값이 들어가있어!

Format String이 참조한 값들을 보면 우리가 지정하지 않은 이상한 값들이 들어가 있다?

 

이대로 출력이 되면 Format String Bug가 발생하는 것이다.

 

아래의 버튼을 클릭하여 예제를 보면서 익혀라!!!!!!!

 

728x90

'Game > Pwnable' 카테고리의 다른 글

Format String Bug 예제 1  (0) 2024.09.22
[Dreamhack_CTF]cpp_type_confusion  (0) 2024.09.19