2011-08-16 4 views
2

보안 단위를 연구 중이며 형식 문자열 공격을 이해하려고합니다. 누군가 제게 이것을 설명해 주시겠습니까? http://julianor.tripod.com/bc/tn-usfs.pdf :형식 문자열 공격 C

다음 코드에서 가져 내가 알고있는 것처럼, %n 형식 지정이 printf 아빠가 스택에서 값 때 다음, 다시 메모리로 지정된 주소를 읽는 데 사용되는

/* 
* fmtme.c 
*  Format a value into a fixed-size buffer 
*/ 
#include <stdio.h> 
int 
main(int argc, char **argv) 
{ 
    char buf[100]; 
    int x; 
    if(argc != 2) 
     exit(1); 
    x = 1; 
    snprintf(buf, sizeof buf, argv[1]); 
    buf[sizeof buf - 1] = 0; 
    printf("buffer (%d): %s\n", strlen(buf), buf); 
    printf("x is %d/%#x (@ %p)\n", x, x, &x); 
    return 0; 
} 

, 그것을 우리 주소를 읽어야합니다. 나는 이것을 벗겨 낼 수 없다. 문서에서

은, 다음의 예는 제공됩니다

perl -e 'system "./fmtme", "\x58\x74\x04\x08%d%n"' 

\x58\x74\x04\x08%d%n는 어디에서 왔는가?

+1

쉘 코드입니다. –

답변

3

"\ x58 \ x74 \ x04 \ x08 % d % n"은 (는) "쉘 코드"입니다.

악용은 해당 문서에서 매우주의 깊게 설명됩니다. 스택 프레임의 일반적인 레이아웃에 대해 어느 정도 이해하고 있어야한다고 생각합니다.이 또한 표에서 설명합니다. 스택 주소는 일반적으로 아래쪽으로 커지므로 실제로 전달 된 것보다 더 많은 인수가 "팝"되는 함수 호출은 자체의 스택 프레임에서 로컬 변수 읽기를 시작합니다. 이것은이 쉘 코드가 이용하는 것이다. 그것은 buf (인해 현재 snprintf 인쇄 그것은 거기에), 그리고 마침내 (그 다음 프레임에서)를 x 변수 스킵의 제 4 바이트 어드레스를두고

buf의 첫 부분에서 어드레스를 판독

(그러나 포인터로 해석 됨) % n 형식 코드를 통해 값을 쓰십시오.