주소 공간 레이아웃 무작위 화 (ALSR) 때문에 다른 프로세스에서 분기 된 프로세스는 mmap
을 호출 할 때 다른 주소가 반환 될 것으로 예상합니다. 그러나 내가 알았 듯이 그것은 사실이 아닙니다. 그 목적을 위해 다음 테스트 프로그램을 만들었습니다. malloc
에 의해 반환 된 모든 주소는 부모와 자식에 대해 정확히 동일합니다. 그들은 큰 블록이 있기 때문에 malloc
PL2, CL1, CL2, PL1 내부적으로 mmap
를 사용 참고.주소 공간 레이아웃 무작위 화 (ALSR) 및 mmap
내 질문은 왜 mmap
이 ALSR이있는 경우에도 다른 주소를 반환하지 않는 이유입니다. 어쩌면 그것의 무작위 화를위한 씨앗은 원래의 갈래 과정에서 동일하기 때문일 수도 있습니다. 아니면 다른 이유가 있습니까? 모든 포인터가 접촉되어야 할 것이다, 그것은 (런타임 환경도 포인터입니다 데이터의 어떤 부분 모른다) 기술적으로 불가능 -
int main()
{
pid = fork();
if (pid == 0) // child
{
void * c1 = malloc(4096);
void * c2 = malloc(4096);
void * cl1 = malloc((long)512e3); // internally uses mmap
void * cl2 = malloc((long)512e3); // internally uses mmap
printf("c1 = %p, c2 = %p, cl1 = %p, cl2 = %p!\n", c1, c2, cl1, cl2);
}
else
{
void * p1 = malloc(4096);
void * p2 = malloc(4096);
void * pl1 = malloc((long)512e3); // internally uses mmap
void * pl2 = malloc((long)512e3); // internally uses mmap
printf("p1 = %p, p2 = %p, pl1 = %p, pl2 = %p!\n", p1, p2, pl1, pl2);
}
return 0;
}
ASLR에서 'mmap'이 다른 주소를 반환하도록 요구하는지 확신 할 수 없습니다. 그것은 단지 다른 것들을 반환 할 수도 있음을 의미합니다. 아마도 (아마도 추측!)'fork'보다는'execve'에 의해 더 많이 트리거됩니다. 물론 두 번 연속해서 프로그램을 시작하면 다른 주소를 얻게됩니다. 그리고 이것은 미래의 커널이나 아마도 SELinux가 활성화 된 것들로 바뀔 수도 있습니다 ... –
당신은 이것을 유용 할 것입니다 : http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/ – Necrolis
@ Basile : 물론 각 실행에 대해 서로 다른 주소를 얻을 수 있지만 하나의 실행에 대해 두 프로세스 (상위 및 하위)의 주소가 다른가? – MetallicPriest