2012-10-16 3 views
2

Shellcoder 's Handbook의 Format String 섹션을 연구 중입니다. 이 책의 조언으로 나는 내 테스트를 수행하기 위해이 같은 코드를 사용 : [formatstring.c]스택 핸들 함수 함수 인수

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 

    if(argc>1) { 

     if(argc>2) { 
      printf("Push a key to continue...\n"); 
      getc(stdin); 
     } 
     printf("Sortie format string => "); 
     printf(argv[1]); 
     printf("\n"); 

    } 
    printf("\n"); 

} 

그래서, 내가 트릭이 인수 (당신은 formatString에 전달 체인을 찾을 수 있습니다 이해

그리고 나중에 printf에 의해 사용된다)를 스택에 놓는다.

./formatstring "aaaa%$offset\$x" 

(오프셋을 일정하게 유지하기 위해 kernel.randomize_va_space를 0으로 설정). 이 그들은 내가 이것을 가지고

for((i=0; i<1000; i++)); do echo -n "$i " && ./formatstring "AAAAAAAA%$i\$x"; done | grep 4141 

작은 배치 스크립트 사용 오프셋 찾으려면 (여기 오프셋 = 137) Firstable

137 Sortie format string => AAAAAAAA41414141 
138 Sortie format string => AAAAAAAA25414141 

내 "AAAAAAAA는"(스택에 "정렬"없는 내가 할 수있는 단지 7을 41로 계산하지만, 포맷 스트링에 8 'A'를 보냈다.) 그리고 스택에 놓이는 방법은 시간이 변하는 것처럼 보인다.> 만약 내가 bash 스크립트 (for)를 2 시간 후에 실행하면 ' A의 "정렬"이 변경되었을 것입니다.

더 많은 혼란이 있습니다. 오프셋을 ./formatstring에 보내는 바이트를 추가 할 때 오프셋이 변경된 것 같습니다. 내가

for((i=0; i<1000; i++)); do echo -n "$i " && ./formatstring "AAAAAAAA%32x%$i\$x"; done | grep 4141 

을 실행하면 나는

136 Sortie format string => AAAAAAAA      b7ff103041414141 
137 Sortie format string => AAAAAAAA      b7ff103025414141 

를 얻을 또는 내가

139 Sortie format string => AAAAAAAA                                                                              b7ff103041410067 
140 Sortie format string => AAAAAAAA                                                                              b7ff103041414141 
141 Sortie format string => AAAAAAAA                                                                              b7ff103033254141 

당신이 볼 수 있듯이, 오프셋 변화를 얻을

for((i=0; i<1000; i++)); do echo -n "$i " && ./formatstring "AAAAAAAA%320x%$i\$x"; done | grep 4141 

실행하고 논리를 따라 난 이해할 수 없다. 이 책에 따르면이 모든 일은 일어나지 않아야한다. 어디서 왔는지 알고 있니? 그것은 스택 보호 메커니즘의 일종입니까? 내가 gcc formatstring.c을 제거 할 수 있습니까?

+0

이 아키텍처를 실행하는 아키텍처는 무엇입니까? 운영 체제/컴파일러 지원과 결합 된 최신 프로세서는 이러한 종류의 공격을 무효화 할 수 있습니다. – jmkeyes

+0

백 트랙 5 인텔 코어 i3 x86 – joub

답변

0

음, 알아 냈습니다. 책이 설명하지 못하는 내용 (또는 영어가 제 네이티브 언어가 아니라는 것을 오해 한 것)는 동일한 오프셋을 유지하려는 경우에만 16 자 (바이트) 세트를 인수에 추가 할 수 있다는 것입니다. 스택.

그래서 "% 320x"를 인수에 추가하면 strlen ("% 320x") = 5이기 때문에 (16-5 = 11) 'A'(또는 다른 문자)도 입력해야합니다.