2010-07-29 4 views
1

내 시스템 (리눅스 커널 2.6.32-24)은 주소 공간 레이아웃 무작위 화 (ASLR)라는 기능을 구현하고 있습니다. ASLR은 스택 크기를 변경하는 것으로 보입니다.가변 스택 크기

void f(int n) 
{ 
    printf(" %d ", n); 
    f(n + 1); 
} 

int main(...) 
{ 
    f(0); 
} 

분명히 프로그램을 실행하면 스택 오버플로가 발생합니다. 문제는 세그먼트 화 오류가 각 실행마다 "n"의 다른 값에서 발생한다는 것입니다. 이것은 분명히 ASLR에 의해 발생합니다 (프로그램을 항상 "n"과 동일한 값으로 종료 할 경우).

나는 두 가지 질문이 있습니다

  1. 은 ASLR은 스택 크기는 약간의 변수를 만들 것을 의미합니까?
  2. 그렇다면이 사실에 문제가 있습니까? 커널 버그 일 수 있습니까?
+1

컴파일러가 그 함수를 단순한 무한 루프로 꼬리 - 호출 - 최적화하지 않는다는 것은 놀라운 일입니다. – caf

답변

1

스택이 다른 할당 된 블록으로 흘러 들어가고 다른 인스턴스가 할당되지 않은 주소 공간을 통해 이동한다는 것을 의미 할 수 있습니다.

+0

나는 처음에는 이것을 생각했지만, 나는 그것을 시험해보고/proc//maps 파일을 보았다. 스택 세그먼트는 다른 매핑과 절대로 가까이 가지 않고 그 크기는 스택 전에 rlimit (rlim_cur)보다 훨씬 커집니다 (한 페이지 이상). – jdizzle

+0

기본 스택 크기가 8192k 인 경우이 제한을 초과하면 분할 오류가 많이 발생한다는 의미입니까? 이 동작을 확인하기위한 지침을 게시 할 수 있습니까? – agori

+0

난/proc//maps 파일을 catted하는 루프를 가지고 있고, proc이 충돌하기 전에 마지막으로 인쇄 한 것을 보았습니다. 스택에 할당 된 메모리 범위는 충돌 시간에 rlimit의 값보다 지속적으로 커졌습니다 (무한 재귀를 시작하기 전에 rlimit 값을 가져 오거나 인쇄합니다) – jdizzle

1

ASLR은 "주소 공간 레이아웃 임의 화"를 나타냅니다. 그것이하는 일은 각 실행마다 다양한 섹션/세그먼트 시작 주소를 변경하는 것입니다. 예, 스택을 포함합니다.

이것은 버그가 아닙니다. 그것은 의도적으로입니다. 그 목적은 부분적으로는 오버 플로우 버퍼를 사용하여 액세스하기 어렵게 만드는 것입니다. 왜냐하면 임의의 코드를 실행하려면 CPU를 속여 스택의 특정 지점이나 런타임 라이브러리에 "반환"해야합니다. 합법적 인 코드는 어디로 돌아갈 지 알지만 일부 통조림 공격은 그렇지 않습니다. 매번 다른 주소가 될 수 있습니다.

명백한 스택 크기가 변경되는 이유는 스택 공간이 바이트가 아닌 페이지 단위로 할당되기 때문입니다. 스택 포인터를 조정하면 특히 페이지 크기의 배수가 아닌 경우 사용 가능한 공간이 변경됩니다.

+0

ASLR이 섹션/세그먼트 크기를 변경할 수 있습니까? 이것에 대한 참고가 있습니까? – agori

+0

그것이 삶의 전체 목적 (그러므로 이름)이되는 것 외에도 http://en.wikipedia.org/wiki/Address_space_layout_randomization 또는 http://netsecurity.about.com/od/quicktips/qt/whatisaslr.htm을 참조하십시오. 좀 더 많은 정보. – cHao

+0

ASLR은 반드시 주소를 변경하지만 변경된 스택 크기에 대해 말하는 모든 문서를 볼 수 없습니다. – agori

관련 문제