2014-10-17 6 views
2

나는 메모리 레이아웃 할당 와 조금 우리가 말할 수 혼란 스러워요.gcc가 스택 메모리 할당

char array[10]; 
int flag = 0; 

여전히 메모리의 할당이 어떻게 할당이 변경되지 않은 와서 같은

(gdb) x/x array : 0xbffff4bc 
(gdb) x/x flag : 0xbffff4cc 

입니다 :

(gdb) x/x array : 0xbffff4bc 
(gdb) x/x flag : 0xbffff4cc 

그러나, 우리가 선을 반전 말할 수? 두 번째 옵션의 플래그가 스택의 배열보다 위에 있지 않아야합니까? 그래서 왜 스택에있는 정수 위에 배열에 할당되는 메모리가 있습니까? -fno-stack-protector 플래그로 컴파일 중입니까? 이 맞나요? 첫 번째 대답을 읽을 때 내가 GCC에서 내 코드를 실행하고 4.7.2 데비안

난 그냥 memory-allocation-issue-buffer-overflow-attack 그러나 같은 문제의 게시물을 발견

편집, 코멘트에 컴파일 때 물리게 -fno-stack-protector으로 문제를 해결해야합니다 (선언 순서에 따라 순차적으로 메모리 할당). 그것은 비록 내 경우에는 작동하지 않습니다. 제안 사항이 있으십니까?

+4

아래에 메모리를 assgneed 것을 의미 지역 변수.컴파일러는 이러한 변수를 자유롭게 재정렬 할 수 있습니다. 모든 준비가 "올바른"것입니다. 왜 이상하다고 생각하니? 배열의 크기가 "고르지"(10 바이트) 때문에 컴파일러가 주변을 이동하여 더 잘 묶거나 정렬 할 수있는 것은 놀라운 일이 아닙니다. – AnT

+0

기본적으로 버퍼 오버플로 및 플래그 내용을 변경하려고합니다. 그래서 버퍼 위에 플래그가있을 때 해당 버퍼 오버플로 작동하지 않아야합니다. –

+0

왜 당신은 할 수 있어야한다고 생각하니? –

답변

2

이 문제에 대한 더 많은 테스트와 실험을 수행 한 후 적절한 해결 방법은 컴파일러가 버퍼 오버플로 공격으로부터 자신을 보호하기 위해 버퍼의 플래그 변수 아래에 버퍼를 배치하도록 허용하는 것입니다.

char password_buffer[16]; 
int auth_flag = 0; 

그래서 당신은이 방법을 실행

x/x password_buffer: 0xbffff4bc 
x/x &auth_flag: 0xbffff4b8 

password_buffer이 언어는 무관의 상대적 메모리 위치에 대한 보증을하지 않습니다 auth_flag

+1

추가 정보 : [Wikipedia : 버퍼 오버 플로우 방지 → 스택 스매싱 보호 → 구현 → GNU 컴파일러 콜렉션 (GCC)] (http://en.wikipedia.org/wiki/Buffer_overflow_protection#GNU_Compiler_Collection_.28GCC.29) – xmojmr

+0

고마워요. 그걸로. –

3

@AndreyT의 의견에 의해 지적 되었 듯이, 컴파일러는 소스에 나타나는 순서와 같은 순서로 컴파일러가 스택에 로컬 변수를 배치해야한다는 요구 사항이 없습니다. 어떤 특정한 순서.

표준에서 구조체에 대한 레이아웃 규칙을 지정하므로 (C99 6.7.2.1 para 13)이를 구조체에 배치하여 순차적으로 배치 할 수 있습니다. 그렇더라도 필요한 경우 컴파일러는 요소 사이에 여백을 넣을 수 있습니다.

그러나 표준에 따르면 배열의 경계 외부에서 쓰는 것이 "정의되지 않은 Behaivour"가되므로 플래그가 안전하게 업데이트된다는 보장이 없기 때문에 전략에 결함이있는 것입니다. 다른 아키텍처 및/또는 컴파일러가 다르게 대응할 수 있으며 하드웨어 트리거 예외 또는 기타 치명적인 조건을 유발할 수 있습니다. 어떤 특정한 행위에 의지 할 수는 없습니다.

+0

사실, 나는 교육상의 이유로 버퍼 오버 플로우 공격을 실험하고 있습니다. 나는 그 책에서 그 두 줄을 뒤집 으면 스택의 메모리 순서가 바뀔 것이라고 예를 발견했다. 그러나 나는 그것이 사실이 아닌 것으로 짐작하고 있습니다. –

0

메모리 단편화를 피하기 위해 더 큰 섹션이 먼저 할당된다는 것은 꽤 정상적입니다 (단, @harmic이 지적한대로).

+0

스택 단편화의 "매우 정상적인"회피라고 주장하는 것에 대한 증거와 관련 소스를 추가 할 수 있습니까? – xmojmr

+0

아니요. 저는 1980 년대 중반부터 더 이상 컴파일러에 액세스 할 수 없기 때문에. – Rein