: 주어진 배열의 크기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
나는 그것이 일종의 버퍼 오버 플로우 보호라고 가정한다. 나는 그것이 무엇인지에 대해 알고 싶다. 또한, 이것은 순전히 자기 교육 (악의적 인 것 없음)에 대한 것입니다! – djwbrown
닫기 투표에 대한 덧글 : 질문에 예제 코드가 있습니다. 무엇이 묻고 있는지 (왜이 정도의 바이트로 메모리 보호가 있는지, 이는 저에게 매우 부족한 것 같습니다) 이는 Mac에서 일반적으로 발생하는 것과 관련이 있습니다. 닫을 필요가 없습니다. – hyde
아래의 0x90 답변을 이해하려면 스택 정렬에 대한 정보가 필요합니다. http://stackoverflow.com/questions/4175281/what-does-it-mean-to-align-the-stack – djwbrown