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을 제거 할 수 있습니까?
이 아키텍처를 실행하는 아키텍처는 무엇입니까? 운영 체제/컴파일러 지원과 결합 된 최신 프로세서는 이러한 종류의 공격을 무효화 할 수 있습니다. – jmkeyes
백 트랙 5 인텔 코어 i3 x86 – joub