본문 바로가기
8. 정보보안 노트 정리

포맷스트링 공격 정리

by Robert8478 2023. 12. 11.

[포맷스트링 공격 원리]

포맷스트링은 printf와 같은 함수에서 %d, %x와 같은 값을 받는 부분이다.

보통 printf("%d",string); 와 같은 방식으로 사용하는데 프로그램을 개발할 때 printf(string)와 같은 방식으로

프로그램을 개발한 상태이며 사용자 입력 값을 받게 될 경우 포맷스트링 취약점이 존재하게 된다.

이는 포맷스트링 인자를 제대로 지정해 주지 않았을 때 공격자가 포맷스트링 인자를 넘겨주면 스택의 주소가

포맷스트링으로 인해 노출되는 취약점이다.



[공격 방식]

여기서 공격자는 입력받는 값에 %08x와 같은 값을 넣어주어 프로그램이 취약한지 확인할 수 있다.

해당 값을 넣어주었을 때 메모리 주소값이 반환 값으로 나온다면 취약함에 해당한다.

공격 시에는 임의의 문자열과 포맷스트링을 같이 넣어주고 해당 문자열이 존재하는 메모리 위치를 파악하여

해당 메모리 위치에 다른 프로그램(PATH와 같은 환경 변수도 가능) 메모리 주소를 삽입하여 %s 인자를 넣어주는 방식으로 공격할 수 있다.

./vuln_program AAAA%08x.%08x.%08x.%08x = 취약 여부 파악 및 메모리 위치 확인

./vuln_program $(printf "\x13\x43\xf1\xff")%08x.%08x.%08x.%s  =  다른 프로그램의 주소를 삽입하여 공격



*다른 프로그램의 주소는 취약한 프로그램 명의 길이를 빼서 알아내는 메모리 주소 계산 프로그램을 제작하여 알아낸다.