IT이야기

C에서 %n 형식 지정자의 용도는 무엇입니까?

cyworld 2022. 6. 21. 22:59
반응형

C에서 %n 형식 지정자의 용도는 무엇입니까?

의 용도는 무엇입니까?%n포맷 지정자는 C로 지정됩니까?예를 들어 설명해주실 분 있나요?

이러한 답변의 대부분은 무엇을 설명됩니다.%n (아무 것도 인쇄하지 않고 지금까지 인쇄된 문자 수를 1개의 문자까지 쓰는 것)int변수) 하지만 아직까지 실제로 어떤 용도의 예를 들어주는 사람은 없습니다.다음 중 하나가 있습니다.

int n;
printf("%s: %nFoo\n", "hello", &n);
printf("%*sBar\n", n, "");

인쇄:

hello: Foo
       Bar

Foo와 Bar가 정렬되어 있습니다.(이것을 사용하지 않고 하는 것은 간단한 일입니다.%n이 특별한 예에 대해서, 그리고 일반적으로 사람들은 항상 먼저 그것을 분해할 수 있다.printf호출:

int n = printf("%s: ", "hello");
printf("Foo\n");
printf("%*sBar\n", n, "");

조금 더 편리함을 더하면 다음과 같은 난해한 것을 사용할 가치가 있는가?%n(오류 도입은) 논의의 여지가 있습니다.)

아무것도 인쇄되지 않았다.인수는 지금까지 쓴 문자 수가 저장되어 있는 부호 있는 int에 대한 포인터여야 합니다.

#include <stdio.h>

int main()
{
  int val;

  printf("blah %n blah\n", &val);

  printf("val = %d\n", val);

  return 0;

}

이전 코드는 다음과 같습니다.

blah  blah
val = 5

관련지어져 있는 인수%n로서 취급될 것이다.int*그 시점에서 인쇄된 총 문자 수로 채워집니다.printf.

요전 날 나는 내가 처한 상황이%n내 문제를 잘 해결할 수 있을 거야이전의 답변과는 달리, 이 경우 저는 좋은 대안을 생각해 낼 수 없습니다.

지정된 텍스트를 표시하는 GUI 컨트롤이 있습니다.이 컨트롤은 텍스트의 일부를 굵은 글씨(또는 기울임꼴 또는 밑줄 등)로 표시할 수 있으며, 시작 및 끝 문자 색인을 지정하여 어느 부분을 지정할 수 있습니다.

제 경우, 컨트롤에 텍스트를 생성하고 있습니다.snprintf대체품 중 하나를 굵은 글씨로 만들어 주셨으면 합니다.이 치환에 대한 시작 및 종료 인덱스를 찾는 작업은 다음과 같은 이유로 간단하지 않습니다.

  • 문자열에는 여러 치환이 포함되어 있으며 치환 중 하나는 임의의 사용자 지정 텍스트입니다.즉, 관심 있는 대체를 텍스트로 검색하는 것이 애매할 수 있습니다.

  • 형식 문자열이 현지화되어 있을 수 있으며,$위치 형식 지정자를 위한 POSIX 확장자.따라서 원래 형식 문자열에서 형식 지정자 자체를 검색하는 것은 간단하지 않습니다.

  • 현지화 측면에서는 포맷 문자열을 여러 개의 콜로 쉽게 분할할 수 없습니다.snprintf.

따라서 특정 대체물을 중심으로 지수를 찾는 가장 간단한 방법은 다음과 같다.

char buf[256];
int start;
int end;

snprintf(buf, sizeof buf,
         "blah blah %s %f yada yada %n%s%n yakety yak",
         someUserSpecifiedString,
         someFloat,
         &start, boldString, &end);
control->set_text(buf);
control->set_bold(start, end);

지금까지의 모든 답은 그것에 관한 것이다.%n그렇긴 하지만 애초에 왜 그걸 원하는지는 몰라요와 함께 있으면 도움이 될 것 같습니다.sprintf/snprintf저장된 값이 결과 문자열에 대한 배열 색인이기 때문에 나중에 결과 문자열을 분할하거나 수정해야 할 수 있습니다.단, 이 어플리케이션이 훨씬 더 유용합니다.sscanf특히 기능하고 있기 때문에scanf패밀리는 처리된 문자 수를 반환하지 않고 필드 수를 반환합니다.

다른 조작의 일부로서 번호를 인쇄하는 것과 동시에, 의사 로그 10을 무료로 취득하는 것도, 정말로 해킹적인 용도입니다.

실제 세계에서의 실제 용도는 별로 본 적이 없습니다.%n지정자이지만 오래 전에 포맷 문자열 공격에 의한 구식 printf 취약성에 사용된 것으로 기억합니다.

이랬던 게

void authorizeUser( char * username, char * password){

    ...code here setting authorized to false...
    printf(username);

    if ( authorized ) {
         giveControl(username);
    }
}

하여 printf의 을 할 수 .%d,%c또는 w/e를 사용하여 콜스택을 통과하여 인가된 변수를 진정한 값으로 변경합니다.

네, 난해한 사용법이지만 보안 취약점을 피하기 위해 데몬을 작성할 때 항상 유용하게 사용할 수 있습니까?:D

지금까지 인쇄된 문자 수 값을 저장합니다.printf()★★★★★★ 。

예:

int a;
printf("Hello World %n \n", &a);
printf("Characters printed so far = %d",a);

이 프로그램의 출력은 다음과 같습니다.

Hello World
Characters printed so far = 12

여기서 지금까지 인쇄된 글자 수를 알 수 있습니다.

n는, 이 지금까지의 가, 의 에 입니다.fprintf()변환되지 .인수는 변환되지 않습니다.

예를 들어 다음과 같습니다.

int n_chars = 0;
printf("Hello, World%n", &n_chars);

n_chars그러면 의 가치를 갖게 될 것이다.12.

이치노에 몇 글자가 되었는지 알 수 있습니다.%n문자열에 int: 에 됩니다.

#include <stdio.h>

int main(int argc, char* argv[])
{
    int resultOfNSpecifier = 0;
    _set_printf_count_output(1); /* Required in visual studio */
    printf("Some format string%n\n", &resultOfNSpecifier);
    printf("Count of chars before the %%n: %d\n", resultOfNSpecifier);
    return 0;
}

(용 문서)

%n은 C99로 VC++에서는 동작하지 않습니다.

%n 형식 지정자를 사용하려는 사용자는 다음을 볼 수 있습니다.

" the "는 사용하지 마십시오."%n" String Specificate( 문자열 )

C에서 printf() 및 sprintf() 유형 함수에 %n 형식 지정을 사용하면 메모리 값을 변경할 수 있습니다.이러한 형식의 설계/실장이 부적절하면 메모리 내용 변경으로 인해 취약성이 발생할 수 있습니다.포맷의 많은 취약성, 특히 "%n" 이외의 지정자를 가진 취약성으로 인해 분할 오류와 같은 기존 오류가 발생합니다.%n 지정자는 더 많은 손상 취약성을 생성했습니다.%n은 2번입니다.이는 악용에 필요한 포인터 값을 생성하기 위해 대량의 데이터를 전송해야 하기 때문입니다."%n"목적을 달성하기 위해 다른 수단을 사용하세요.

출처: 링크

언급URL : https://stackoverflow.com/questions/3401156/what-is-the-use-of-the-n-format-specifier-in-c

반응형