코딩 및 기타

포맷 스트링 버그

정지홍 2024. 8. 28. 16:18
포맷스트링?
c언어에 있는 printf함수에서 사용되는것.
ex) %d , %s , %x , %p , %n....
근데 주로 %n에서 일어나며, 이는 지금까지 출력한 바이트수를 포인터가 가르키는 주소에 넣어준다.
int main(int argc,char* argv[]) {
	char a[100];
    
    strcpy(a,argv[1]);
    
    printf("%s\n",a);
    printf(a);
    
    return 0;
}
만약 위에같은 코드를 실행 시켜서 작동시킨다면.....
aaaaa를 입력하면 둘 다 aaaaa이 출력됨.
하지만 aaaaa%x를 입력시 첫번째는 aaaaa%x가 출력되며 두번째는 aaaaa특정주소가 출력됨.
출력되는 주소는 함수인자가 있는 곳의 메모리를 참조해서 출력.



만약 위에같은 코드를 실행 시켜서 작동시킨다면.....
aaaaa를 입력하면 둘 다 aaaaa이 출력됨.
하지만 aaaaa%x를 입력시 첫번째는 aaaaa%x가 출력되며 두번째는 aaaaa특정주소가 출력됨.
출력되는 주소는 함수인자가 있는 곳의 메모리를 참조해서 출력.
저게 왜 문자가 되냐면 단순 출력을 위해서라면 정상적으로 출력되나,
포맷스트링 중에서는 메모리 값을 출력 및 쓸 수 있는것도 존재하기 때문
%n: 이전까지 입력된 문자의 갯수를 더하여 참조하는 메모리 주소에 쓴다.
그러면 만약 임의의 주솟값을 넣어두고 %s를 쓴다면 주소값의 문자열을 출력할것임
하지만 %n을 사용 한다면 이전의 출력된 문자열의 갯수를 세어서 임의의 주솟값에 쓸 것임

그러면 %c나 %d를 사용하여 앞에 숫자를 쓴다면, 쓴 숫자만큼의 공백의 문자나 정수를 출력할 것이며 이를 이용하면 %n에 쓸 값을 마음대로 설정함.
ex) %1024c%n 이라면 임의의 주소에 0x400 을 기록한다.