- printf() 함수를 사용할 때 인자로 '포맷 스트링'과 '포맷 스트링에 대응하는 인자'를 사용하지 않고 직접 변수를 인자로 사용할 경우,
악의적인 포멧 스트링을 삽입하여 스택 내용을 확인하거나 메모리 주소 값을 변조(원하는 위치에 특정 주소 값을 삽입)하는 취약점이다. - 이때, 포멧 스트링 중에 '%n'을 이용하면 '%n' 앞에 출력된 자리수를 계산하여 스택 다음 4byte에 있는 내용을 주소로 여기고 해당 주소에 계산한 자리수를 10진수로 입력하기 때문에 포멧스트링 버그를 이용하여 스택의 값을 변조할 수 있다.
- 또한, %n 앞에 다른 포멧 스트링을 이용하면 자리수를 지정하거나 특정 값을 넣을 수 있다. (%64413d%n : '64413'을 넣어라)
[참고] 포멧 스트링
- %d : 정수형 10진수 상수
- %c : 문자 값
- %s : 문자열
- %x : 16진수
- %n : 사용한 총 바이트수
- %hn : %n의 절반인 2바이트 단위로 계산
1. FTZ level 20
'메가IT아카데미 국기과정 > 리눅스와 시스템보안' 카테고리의 다른 글
[3-11] FTZ 9~19 (0) | 2022.09.12 |
---|---|
[3-10] 메모리 구조 (0) | 2022.09.12 |
[3-9] 어셈블리어 (0) | 2022.09.12 |
[3-8] 레지스터 구조 (0) | 2022.09.12 |
[3-7] BeEF (0) | 2022.09.12 |