2013-02-23 1 views
2

: 주어진 배열의 크기C 버퍼 오버플로 - 세그 폴트를 트립하는 데 일정한 바이트 수가있는 이유는 무엇입니까? (맥 OS 10.8 64 비트 연타) I는 C의 버퍼 오버플로 실험하고 흥미로운 특질 발견 하였다

가 될 수 오버플 바이트의 일련 번호가 될 것 같다 SIGABRT 충돌 전에 메모리에 기록됩니다. 예를 들어, 아래의 코드에서 27 바이트로 충돌하기 전에 10 바이트 배열을 26 바이트로 오버플로 할 수 있습니다. 마찬가지로 20 char의 배열은 41에서 중단되기 전에 40 char으로 오버플로 될 수 있습니다.

이유가 누구인지 설명 할 수 있습니까? 또한 SIGABRT는 "세분화 오류"와 동일합니까?

Mac OS 10.8 - Xcode 4.6, clang 및 lldb. 감사!

#include <stdio.h> 

int main(int argc, const char * argv[]) 
{ 
    char aString[ 10 ]; 
    char aLetter = 'a'; 

    printf("The size of one array slot sizeof(aString[0]) is %zu\n", sizeof(aString[0])); 
    printf("The size of one letter  sizeof(aLetter) is %zu\n", sizeof(aLetter)); 

    // Overflow the aString array of chars 
    // lldb claims aString is initialized with values \0 or NULL at all locations 

    // Substitute i<27 and this code will crash regularly 
    for (int i=0; i<26; i++) { 
    aString[i]= aLetter; 
    } 

return 0; 
} 

편집 - 난 분해에 그것을 통해 밟은 직후이 보호를 찾은를위한 루프 : mac OS에서 스택의 정렬로 인해

0x100000f27: movq 226(%rip), %rax   ; (void *)0x00007fff793f24b0: __stack_chk_guard 
0x100000f2e: movq (%rax), %rax 
0x100000f31: movq -8(%rbp), %rcx 
0x100000f35: cmpq %rcx, %rax 
0x100000f38: jne 0x100000f49    ; main + 121 at main.c:26 
. 
. 
. 
0x100000f49: callq 0x100000f4e    ; symbol stub for: __stack_chk_fail 
+0

나는 그것이 일종의 버퍼 오버 플로우 보호라고 가정한다. 나는 그것이 무엇인지에 대해 알고 싶다. 또한, 이것은 순전히 자기 교육 (악의적 인 것 없음)에 대한 것입니다! – djwbrown

+2

닫기 투표에 대한 덧글 : 질문에 예제 코드가 있습니다. 무엇이 묻고 있는지 (왜이 정도의 바이트로 메모리 보호가 있는지, 이는 저에게 매우 부족한 것 같습니다) 이는 Mac에서 일반적으로 발생하는 것과 관련이 있습니다. 닫을 필요가 없습니다. – hyde

+0

아래의 0x90 답변을 이해하려면 스택 정렬에 대한 정보가 필요합니다. http://stackoverflow.com/questions/4175281/what-does-it-mean-to-align-the-stack – djwbrown

답변

3

.

이 아니다 큰 뉴스, 당신이 그것을 봤 경우, 당신은 대답 찾을 것입니다 : 영향을 당신이 실제로 어떤면 스택에 기록 할 수있는 볼 좋은

Why does the Mac ABI require 16-byte stack alignment for x86-32?


을 16 바이트보다 작은 청크.

여러 번 악용하는 경우 모든 악성 코드가 누출 될 수있는 상태가되어 스택에서 점프 할 수 있습니다.

+0

이것을 표시하고 싶습니다. 대답은 정확하지만 여전히 16 바이트 스택 정렬이 16의 배수가 아닌 "cutoffs"를 생성하는 이유는 확실하지 않습니다. – djwbrown

+0

@djwbrown 컷오프가 무엇을 의미하는지 설명 할 수 있습니까? – 0x90

+0

@djwbrown, 비교적 일반적인 스택 프레임을 가정 : 모든 함수 매개 변수, 반환 주소 및 다른 스택 데이터 (저장된 레지스터 등)가 다른 16 바이트 청크에서 끝난다 고 가정합니다. 지역은 다음 16Y이트 경계로 정렬됩니다. ABI에 뛰어 들지 않거나 다른 사람들이 그것에 대해 너무 깊이 쓴다면, 각 로컬이 16 바이트 정렬인지 아닌지는 확실하지 않지만 대답은 '예'라고 가정합니다. 지역 주민이 역순으로 주문하면 잠재적으로 16 (비 로컬 스택 데이터의 끝) + 16 ('aLetter') + 16 (버퍼) = 48 바이트까지 쓸 수 있습니다 –