스레딩은 하나의 프로세스가 단일 메모리 공간을 공유하여 여러 작업을 수행할 수 있도록한다.
Windows 커널은 프로세스가 아닌 스레드에 프로세서 시간을 나눠 제공한다.
리눅스는 상당히 약한 "경량 프로세스" 모델로 작업을 수행한다.
Linux Native Threads가 구현될 때만, 리눅스는 나머지 현대 OS 세계와 안정적인 스레드 기반을 유지한다.
스레드는 NT 보안 구조가 설명됨에 따라 명확해지므로 리눅스에서 프로그래밍 모델만큼 중요하지 않다.
스레딩은 HRESULT의 이유이다.
기본적으로 정수 값인 HRESULT는 거의 모든 Win32 API호출에서 반환된다.
HRESULT는 오류 값 또는 OK 값일 수 있다.
그것이 에러 값이면, GetLastError()의 특정 오류(스레드 로컬 저장소에서 검색한 값)를 얻을 수 있다.
너가 유닉스 모델에 대해 생각한다면, 하나의 스레드 errno를 다른 스레드와 구별할 방법이 없다.
Win32는 처음부터 스레드 모델로 설계되었다.
윈도우즈는 fork()가 없다. (리눅스에서 새 프로세스를 생성하는데 사용)
대신에, createProcess()는 자기자신만의 메모리 공간을 가지는 새로운 프로세스를 생성한다.
이 프로세스는 부모가 상속가능으로 표시한 모든 핸들을 상속할 수 있다.
그러나, 부모는 이 핸들을 자식에게 전달하거나 자식이 값을 추측하도록 해야 한다.
(핸들은 일반적으로 파일 핸들과 같은 작은 정수이다.)
거의 모든 오버플로가 스레드에서 발생하기 때문에, 공격자는 유효한 스택 주소를 알 수 없다.
이것은 공격자가 거의 항상 libc-style로 복귀하는 트릭(libc 또는 동등한 것뿐만 아니라 DLL을 사용하더라도)을
사용하여 실행을 제어한다는 것을 의미한다.
'시스템 > 윈도우' 카테고리의 다른 글
Distributed CommonObject Model 및 DCE-RPC의 천재와 공용 (0) | 2021.01.13 |
---|---|
문자열 테이블 (0) | 2019.09.12 |