Program Club

C-% x 형식 지정자

proclub 2020. 12. 15. 19:31
반응형

C-% x 형식 지정자


작은 질문이 있습니다. % x 형식 지정자를 사용하여 형식 문자열 공격의 스택에서 값을 읽을 수 있다는 것을 알고 있습니다.

다음 코드를 찾았습니다.

%08x%08x%08x%08x

08은 무엇을 의미합니까? 정확히 무엇을하고 있습니까? 감사 :)


고장:

  • 8 8 자리를 표시하고 싶다고합니다.
  • 00공백 대신 ' 를 접두사로 사용하려는 경우
  • x 소문자 16 진수로 인쇄하려는 것입니다.

빠른 예 (Grijesh Chauhan에게 감사) :

#include <stdio.h>
int main() {
    int data = 29;
    printf("%x\n", data);    // just print data
    printf("%0x\n", data);   // just print data ('0' on its own has no effect)
    printf("%8x\n", data);   // print in 8 width and pad with blank spaces
    printf("%08x\n", data);  // print in 8 width and pad with 0's

    return 0;
}

산출:

1d
1d
      1d
0000001d

참조는 http://www.cplusplus.com/reference/cstdio/printf/ 를 참조하십시오.


%08x 모든 숫자는 누락 된 모든 숫자를 0으로 채우고 최소 8 자 너비로 인쇄해야합니다. 예를 들어 '1'출력은 00000001


표시 할 자릿수를 지정합니다.

최소 필드 너비를 지정하는 정수 값 또는 *. 결과는 필요한 경우 공백 문자 (기본적으로)로 채워지고, 오른쪽 맞춤이면 왼쪽에, 왼쪽 맞춤이면 오른쪽에 채워집니다. *가 사용되는 경우 너비는 int 유형의 추가 인수로 지정됩니다. 인수의 값이 음수이면-플래그가 지정되고 양의 필드 너비가 지정됩니다.


에서 http://en.wikipedia.org/wiki/Printf_format_string

너비 옵션이 지정된 경우 필드를 채우려면 공백 대신 0을 사용하십시오. 예를 들어, printf("%2d", 3)결과는 "3"이고 printf("%02d", 3)결과는 "03"입니다.


언급 한 printf에 대한 형식 문자열 공격은 "% x"형식에만 국한되지 않습니다. printf에 전달 된 변수보다 많은 형식 지정 매개 변수가있는 경우에는 해당되지 않는 스택의 값을 읽습니다. 예를 들어 % d에서 동일한 문제가 발생합니다. % x는 이러한 값을 16 진수로보고 싶을 때 유용합니다.

이전 답변에서 설명한 것처럼 % 08x는 앞에 0으로 채워진 8 자리 16 진수를 생성합니다.

추가 매개 변수없이 printf의 코드 예제에서 형식화 사용 :

printf ("%08x %08x %08x %08x");

스택에서 4 개의 매개 변수를 가져 와서 8 자리 패딩 16 진수로 표시합니다.

참조 URL : https://stackoverflow.com/questions/15108932/c-the-x-format-specifier

반응형