본문 바로가기

Penetration/WEB

[주요정보통신기반시설] 2. 포맷 스트링 - 이론편

이번엔 포맷 스트링에 대해서 알아보려고 합니다.

포맷 스트링은 일반적으로 C기반 프로그래밍에서 변수의 값을 출력하고나 입력받을 때 입력받은 값의 메모리 주소를 확인하고 이를 변조하여 exploit를 이용할 수 있는 취약점입니다. 이에 대한 일반적인 점검으로는 포맷스트링을 대입하여 입력에 대한 반응을 보이는지 아닌지를 통해서 취약여부를 판단할 수 있습니다.

%d : 정수형 10진수 상수
%f : 실수형 상수
%lf : 실수형 상수
%c : 문자값
%s : 문자 스트링
%u : 양의 정수(10진수)
%o : 양의 정수(8진수)
%x : 양의 정수(16진수)
%n : 쓰인 총 바이트 수

와 같은 포맷 스트링을 사용할 수 있습니다. 해당 포맷 스트링중 %n은 이전까지 입력되었던 문자열의 길이(Byte)수 만큼 해당 변수에 저장시키기 때문에 메모리의 내용도 변조가 가능하므로 Format String 취약점의 핵심으로 사용됩니다.

 

패턴1 - %n%n%n%n%n%n%n%n%n%n,
패턴2 - %s%s%s%s%s%s%s%s%s%s,
패턴3 - %1!n!%2!n!%3!n!%4!n!%5!n!%6!n!%7!n!%8!n!%9!n!%10!n!
패턴4 - %1!s!%2!s!%3!s!%4!s!%5!s!%6!s!%7!s!%8!s!%9!s!%10!s!

이러한 패턴들을 사용해서 점검하게 되고 주로 많이 사용하는 패턴은 3번이나 4번 패턴입니다.

 

해당 취약점의 경우 C언어로 기반으로 만드는 CS프로그램에서 자주 나타나기 때문에 WEB 기반인지 CS프로그램 기반인지를 파악하는 것이 중요하다고 할 수 있습니다.

 

저도 위의 취약점 사례에 해당하는 경우를 많이 보지 못했으므로 추후에 실전편을 따로 실습하여 다룰 예정입니다.