'%n'에 해당되는 글 1건

  1. 2008.11.25 %n 포맷 토큰 1
Hacking & Security/System2008. 11. 25. 14:57
[%n 포맷 토큰]

1. 포맷 토큰이란?
printf, sprintf 을 사용하게 되면, %d 등의 포맷 토큰을 사용하게 된다.
이 포맷토큰은 실질적으로 문자열로 변환되었을 때 얼마나 많은 양을 차지할지 가늠하기가 쉽지 않은데, 그렇다고 해서 항상 크기를 계산하여 작성하는 사람들은 그리 많지 않다.
이 포맷 토큰 자체가 편의성을 위한 것이기 때문이다.

대부분 다음과 같이 많이 사용하게 되는데,

char szMsg[256];
sprintf(szMsg, \"%x %d\", nData1, nData2);

만약, %x, %d 등이 변환되는 길이가 매우 커서 256 크기를 넘어선다면, 이는 심각한 오류를 초래할 수 있다.

2. %n 포맷 토큰
%n 포맷토큰은 출력된 문자열의 길이를 알려주는 기능을 하며 상당히 유용하게 사용할 수 있다.
사용 방법은 다음과 같다.

int nData;
printf(\"%n\", &nData);

이렇게 사용하면 nData 에, printf 에서 출력한 문자의 길이를 얻을 수 있다.

다음은 간단한 사용 예 이다.

int nRetSize = 0;
printf(\"Your String is %X %d %s %n\\n\", 1024, 1024, \"Test String\", &nRetSize);
printf(\"Printed bytes: %d\\n\", nRetSize);

[요약]
%n 연산자를 사용하여 출력된 문구의 길이를 알아낼 수 있다. 이러한 정보들은 디버깅시 좋은 정보가 될 수 있으며, buffer overflow 에 대한 예방과 조취에 유용하게 사용될 수 있다.
Posted by skensita