모두의 dream

프로세스와 스레드, 핸들(Windows)과 커널 본문

분야/Reversing

프로세스와 스레드, 핸들(Windows)과 커널

오리꽥이로 2022. 4. 2. 18:39
Contents 접기

공부를 하며 정리한 내용으로 잘못된 내용이 있을 수 있습니다.

 

악성코드를 분석하다 보면 핸들과 관련된 코드들이 항상 나온다.

이번 기회에 제대로 어떤 기능인지 알고 넘어가고자 관련된 내용들을 정리했다.

 

1. 프로세스와 커널

현재 실행중인 프로그램이 프로세스. (실행중이지 않은 상태를 프로그램이라고 함)

흔히 알고 있는 메모리 구조(Code, Data, Heap, Stack)는 이 프로세스마다 독립적으로 존재한다.

프로세스안에 더 많은 정보(값)들이 들어갈 수도 있지만 일단 아는 선에서 그림으로 표현했다.

 

여기서 들었던 의문점: 커널은 스택 위쪽에 있다고 공부했는데, 그럼 커널도 프로세스마다 존재하는건가??

그렇지 않다. 유저영역에서 프로세스들이 돌아가고 있고, 커널영역에 커널이 단독으로 자리잡고 있다.

커널이 스택 위쪽에 있다는 이야기는 유저영역에서 가장 높은 주소값을 가지고 있는 스택 위쪽에 있다는 뜻으로 볼 수 있다.

 

커널이란?

메모리에서 운영체제가 올라가있는 영역. (운영체제도 결국 메모리에 올라가야 동작할 수 있다.)

 

역할

1. 컴퓨터에 있는 하드웨어를 관리하면서 사용자가 하드웨어를 사용할 수 있도록 서비스를 제공한다.

2. 컴퓨터의 자원들을 관리한다.

 

사용자는 필요한 OS 기능을 System Call 을 이용해서 커널에 요청하면 커널이 처리한 후 다시 사용자에게 결과를 전달하게 된다. (커널은 OS의 핵심이다 보니 직접적인 접근이 불가능하므로 System Call을 이용한다.)

 

아래는 시스템콜을 진행하는 과정이다.

응용프로그램은 System Call을 이용하여 만들어진 API를 이용해서 커널에 필요한 OS 기능을 요청한다.

사용자쉘을 이용하여 명령어를 전달하고, 쉘은 명령어를 해석한 후 System Call을 거쳐 커널에 필요한 OS 기능을 요청한다.

 

OS 구조

위 사진이 사용자가 필요한 OS 기능을 사용하기 까지 거치는 과정이다.

(Shell도 API를 이용해서 구성되어 있기 때문에 이렇게 표현된 것으로 보인다. 사실 확신은 못한다...)

 

쉘(shell)을 땄다, 계산기를 띄웠다 -> OS의 기능과 서비스를 조작할 수 있다.

 

2. 스레드

프로세스 내에서 실제로 작업을 수행하는 주체이다.

(프로세스가 할당받은 자원을 이용하는 실행의 단위)

 

싱글 스레드

프로세스에 한 개의 스레드만 실행됨.

 

멀티 스레드

1. 하나의 프로세스에는 여러개의 스레드가 존재할 수 있다.

2. 한 개의 프로그램에서 여러개의 작업을 하는 경우가 존재하고, 이를 위해서 (멀티)스레드를 사용하게 된다.

 

스레드는 한 프로세스에서 code, data, heap 영역을 공유하여 사용하고 stack 영역만 별도로 가지고 있다.

 

3. 핸들

자원을 관리하기 위해 운영체제가 부여하는 ID이다.

리눅스에서는 파일디스크립터(File Descriptor)이다.

 

운영체제를 제어하기 위한 여러 정보들을 자원(리소스)라고 부르고, 이 리소스에 직접적으로 접근하는건 보안적으로 큰 위협이므로 핸들이라는 값을 이용해 접근하도록 한다.

 

이해한 바가 맞는지 잘 모르겠지만, 결국 핸들이라는건 윈도우에서 시스템콜을 이용하여 사용자가 요청한 OS의 기능을 쓰기 위해 반환되는 주소가 핸들인 것 같다.

 

예시 1) 

1. kernel32.dll 에 있는 OS를 제어하는 API들을 사용하고 싶다.

2. getmodulehandle API를 이용해서 kernel32.dll의 핸들값을 가져온다.
3. 가져온 핸들값을 이용해서 kernel32.dll에 접근이 가능해지고, 그 안에 있는 필요한 API들이 사용 가능해진다.

4. 여기서 dll이 자원(resource) 이다.

 

예시2)

1. 현재 실행중인 프로세스의 권한을 확인하고 싶다. (프로세스는 운영체제가 관리함)

2. 이 프로세스의 핸들값을 가져온다.

3. 가져온 핸들값을 이용하여 프로세스의 권한을 확인하거나 변경한다.

 

예시의 내용이 위에 있는 OS 구조 사진에서 라이브러리 or API 부터 시스템 콜 까지의 과정에 포함된다.

kernel32.dll의 API를 사용하게 된다면 운영체제 영역까지 포함되게 된다.

 

References

(1) [OS] Lecture 2. OS Overview (1/3) / 운영체제 강의 - YouTube

The Graynews - [Term] 알쏭달쏭 커널과 쉘 (grayhash.com)

[운영체제] 운영체제 구조 - 시스템콜, 사용자 모드, 커널 모드 (tistory.com)

프로세스와 스레드의 차이 (velog.io)

코딩의 시작, TCP School

짱짱해커 OZ1NG, ClasSun9의 도움

'분야 > Reversing' 카테고리의 다른 글

윈도우 권한 (Windows privilege)  (0) 2022.04.01
DLL Injection & Ejection  (0) 2022.03.21
Comments