[Windows]윈도우 시스템 해킹 - 포맷 스트링

Hyenna·2023년 5월 16일
0

Security

목록 보기
2/10

🚨포맷 스트링 공격

  • 프로그램에 입력된 문자열 데이터가 명령으로 해석될 때 발생
  • 메모리에 셸을 띄워 놓고, RET 값을 변조하여 관리자 권한 획득 가능
  • 스택 메모리 일부를 읽거나 실행중인 프로그램에 Segmentation Fault를 발생시켜 시스템에 의도되지 않은 동작을 일으킬 수 있음

* Segmentation Fault?
프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생


🚨포맷 함수(Format Function)

프로그램 언어의 변수를 사람이 읽을 수 있는 문자열 형식으로 변환하는 printf, fprintf와 같은 ANSI C 함수

Format functionDescription
fprintWrites the pritf to a file
printfOutput a formatted string
sprintfPrints into a string
snprintfPrints into a string checking the length
vfprintfPrints the a va_arg structure to a file
vprintfPrints the va_arg structure to stdout
vsprintfPrints the va_arg to a string
vsnprintfPrints the va_arg to a string checking the length

🚨포맷 스트링(Format String)

  • 포맷 함수의 인자
  • 아래와 같은 텍스트 및 포맷 인자를 포함하는 ASCII 문자열
 printf("The magic number is : %d\n", 1911);

🚨포맷 스트링 인자(Format String Parameter)

  • %x, %s와 같은 포맷 스트링 인자는 포맷 함수의 변환 형태를 정의
  • 포맷스트링 인자가 데이터에 삽입되면 해당 문자열은 포맷 함수에 의해 파싱되고 인자에 지정된 변환이 일어남
ParametersOutputPassed as
%%%character(literal)Reference
%pExternal representation of a pointer to voidReference
%ddecimalValue
%ccharacterValue
%uUnsigned decimalValue
%xHexadeciamlValue
%sStringReference
%nWrites the number of characters into a pointerReference

🚨포맷 스트링 공격 예시

[취약한 포맷 스트링]

<test.c>

#include <stdio.h>
void main()
{
	char *buffer = "wishfree\n%x\n";
    printf(buffer);
}
  • char *buffer에 문자열을 입력할 때 %x라는 포맷 스트링 문자를 추가
  • test.c를 컴파일 하면 "wishfree" 문자열 외에 스택상의 주소값인 "8048440"이라는 숫자가 출력

[포맷 스트링 문자를 이용한 메모리 변조]

<wrong.c>

#include <stdio.h>
int main()
{
	int a;
    
    printf("aaabbbccc%n", &a);
    printf("\n a : %d", a);
}
  • %n은 지금까지 출력해준 바이트수를 인자에다 넣어줌
  • aaabbbccc = 9bytes
  • a = 9;

🔰대응 방안

  • printf와 같은 함수에서 포맷 스트링 문자열에는 상수 문자열을 사용하거나, 사용자 입력을 직접 전달하지 말고 이를 변수에 할당한 후 변수를 사용
  • 보안 취약점 검사도구 사용하여 취약점 미리 확인
  • 입력값 검증
  • 권한을 최소화하고 필요한 권한만 부여하는 것이 좋음

*출처: https://s1m0hya.tistory.com/19

0개의 댓글