- 프로그램에 입력된 문자열 데이터가 명령으로 해석될 때 발생
- 메모리에 셸을 띄워 놓고, RET 값을 변조하여 관리자 권한 획득 가능
- 스택 메모리 일부를 읽거나 실행중인 프로그램에 Segmentation Fault를 발생시켜 시스템에 의도되지 않은 동작을 일으킬 수 있음
* Segmentation Fault?
프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생
프로그램 언어의 변수를 사람이 읽을 수 있는 문자열 형식으로 변환하는 printf, fprintf와 같은 ANSI C 함수
Format function | Description |
---|---|
fprint | Writes the pritf to a file |
printf | Output a formatted string |
sprintf | Prints into a string |
snprintf | Prints into a string checking the length |
vfprintf | Prints the a va_arg structure to a file |
vprintf | Prints the va_arg structure to stdout |
vsprintf | Prints the va_arg to a string |
vsnprintf | Prints the va_arg to a string checking the length |
- 포맷 함수의 인자
- 아래와 같은 텍스트 및 포맷 인자를 포함하는 ASCII 문자열
printf("The magic number is : %d\n", 1911);
- %x, %s와 같은 포맷 스트링 인자는 포맷 함수의 변환 형태를 정의
- 포맷스트링 인자가 데이터에 삽입되면 해당 문자열은 포맷 함수에 의해 파싱되고 인자에 지정된 변환이 일어남
Parameters | Output | Passed as |
---|---|---|
%% | %character(literal) | Reference |
%p | External representation of a pointer to void | Reference |
%d | decimal | Value |
%c | character | Value |
%u | Unsigned decimal | Value |
%x | Hexadeciaml | Value |
%s | String | Reference |
%n | Writes the number of characters into a pointer | Reference |
<test.c>
#include <stdio.h>
void main()
{
char *buffer = "wishfree\n%x\n";
printf(buffer);
}
%x
라는 포맷 스트링 문자를 추가스택상의 주소값인 "8048440"이라는 숫자가 출력
됨<wrong.c>
#include <stdio.h>
int main()
{
int a;
printf("aaabbbccc%n", &a);
printf("\n a : %d", a);
}
바이트수를 인자에다 넣어줌