SYSTEM
FSB(포맷 스트링 버그)
말뚝_2
2014. 7. 27. 18:33
Format String Bug - 포맷 스트링 버그
printf() 함수를 사용할때, 함수에 원형에 따른 사용 방법은 ("변수이름",서식문자) 이지만 사실 변수 이름만 사용해도 별 문제는 없다. 그러나 변수의 내용안에 서식문자가 들어가게 되면 문제가 발생한다. printf함수가 실행되는 와중에 서식문자를 만나고, 만난 서식문자를 문자열로 보지 않고 서식 문자로 인식해버려 현재 메모리 스택의 다음 4바이트를 참조해 서식문자에 맞는 값을 출력해버린다. 이때의 변수는 printf함수의 인자값 형태로 들어갈텐데, esp가 계속 올라가면서 메모리를 참조하다보면 printf()함수의 ret 위치까지 참조를 해버린다. 이때 발생하는게 포멧 스트링 버그다.
단순히 참조만 한다면 에러가 나지 않겠지만, %n서식문자를 사용하면 에러가 발생한다. %n서식문자는 %n이 나오기전 출력된 자릿수를 계산하여 다음 참조될 메모리 4바이트를 주소값으로 인식, 해당 주소 위치에 4바이트 만큼의 숫자를 입력해버린다. 이때문에 원래 정상적인 값이 들어가야만 하는 위치에 전혀 다른값이 들어가게 할 수 있다.
또한, 문자열의 길이를 계산하는 %n 서식문자의 특성상 %c서식문자를 통해 특정 길이의 문자를 출력하여 원하는만큼의 숫자를 %n서식문자가 출력하게 만들 수 있다. (%’숫자’c 형태로 사용)
%hn 이라는 서식문자는 %n과 같은 기능을 하지만, 4바이트 값이 아닌 2바이트 값을 입력하는 기능을 한다.