내가 이해한 바로는 스택 카나리아는 다음과 같이 작동합니다. 프로그램이 시작되면 임의의 값이 생성되어 스레드 로컬 저장소( %fs:0x28
)에 저장됩니다. 이 임의의 값은 각 함수 호출 시 스택에 푸시되므로 나중에 확인할 수 있습니다.
TLS 영역의 "마스터 쿠키"와 관련하여 두 가지 질문이 있습니다.
이 레이아웃에서 스레드 로컬 저장소는 어디에 있습니까?
- 프로세스가 새 스레드를 생성하면 스레드 로컬 저장소(따라서 스택 카나리아 값)가 새 스레드에 복사됩니까? 아니면 커널이 각 스레드에 대해 새로운 스택 카나리아 값을 생성합니까?
답변1
새 스레드가 생성되면 스레드 스택에 메모리 영역이 할당됩니다. 스레드 지역 변수를 위한 공간이 이 영역에서 할당됩니다. 엄밀히 말하면 TLS 변수는 스택의 일부가 아닙니다. 즉, 스택에서 푸시되거나 팝되지는 않지만 스택 상단의 동일한 영역에 존재합니다.
이 영역이 주소 공간에서 위치하는 위치는 여러 요인에 따라 달라집니다. Create a new thread를 사용할 때
pthread_create
프로그래머는 스레드의 스택으로 사용할 메모리에 포인터를 전달할 수 있습니다. 이 메모리의 위치는 메모리 할당 방법에 따라 다릅니다. 사전 할당된 메모리를 사용하지 않는 경우mmap
with 인수NULL
를 사용하여 메모리 영역이 할당되며addr
, 이를 통해 커널은 메모리가 매핑되는 위치를 결정할 수 있습니다. x86_64에서 이런 방식으로 할당된 메모리는 스택과 힙 사이에 있습니다.각 스레드는 새로운 카나리아 값을 사용합니다. 답변 보기이 문제.