시스템 콜
System Call / 시스템 호출
1. 개요
대다수의 운영체제들[1] 은 커널 모드와 사용자 모드가 구분되어 있으며, 커널 모드는 Ring0에 사용자 모드는 Ring3에 속한다. (Ring 1~2는 장치 드라이버 전용이다)[2]
커널 모드는 커널 및 드라이버 같은 커널 코드를 실행하는 것들이 포함되며, 사용자 모드는 프로그램 같은 커널 코드가 없는 것들이 포함된다.
일반적인 프로그램들은 사용자 모드에서 실행되므로 커널 모드에 대한 직접적인 접근이 불가능하다. 따라서 커널에 요청하여 커널 모드에서 처리하고 그 결과를 사용자 모드의 프로그램에게 전달하는 것이 바로 시스템 콜이다.
시스템 콜은 프로그램의 거의 모든 코드의 실행에서 발생하며 파일 생성이나 쓰기 또는 읽기, 키보드 입력, 그래픽 출력, 스레드 생성 및 제어 같은 것도 시스템 콜을 통해 커널에 요청하여 커널 모드에서 처리한다. 예로 들어서는 Windows API 중 하나인 NtCreateFile 함수는 실제로는 커널 모드의 IoCreateFile 함수가 실행된다.
윈도우에서 커널 함수가 사용자 모드에 노출되는 것은 '''ntdll.dll'''이며 실제 구현체는 윈도우 커널인 '''ntoskrnl.exe'''이다. ntdll.dll의 대부분 함수는 커널에서 구현되고 ntdll.dll를 통해 이들 함수가 사용자 모드에 노출된다. [3]
디바이스 드라이버는 커널 모드에서 실행되므로 시스템 콜을 통하지 않고 바로 커널 함수를 실행할 수 있다.
2. sysenter
'''INT 2E (SYSENTER)''' 명령을 통해 커널 모드로 진입하게 된다. 윈도우의 경우 Windows 2000부터 Fast System Call를 사용하게 되는데 예시로 OpenProcess 함수 실행 과정을 보면 아래와 같다.
3. 중요성
시스템 콜은 운영체제에게 있어서는 매우 중요한 요소이다. 사용자 모드에 있는 프로그램이 커널 함수를 직접 호출할 수 없으므로 따로 프로그램이 커널 호출을 요청하는 시스템을 만들어서 커널이 처리해야할 일을 프로그램으로부터 받아서 처리하는 것이다. 만약에 없으면? 사용자 모드에서 아무것도 할 수 없게 된다! 그래픽 출력이라거나 파일 다루는 등 행위도 커널의 도움으로 이루어진다.
4. 후킹
시스템 콜은 사용자 모드의 프로그램이 커널에게 호출을 요청하는 것이므로 후킹은 그 요청을 가로채서 원래의 함수를 실행시키고 그 다음에 뭔가를 하는 것이다. 이는 해커들이 악성코드를 감염시킬 때 쓰며 전체 또는 어떤 프로그램의 시스템 콜을 후킹하여 악의적인 행동을 하도록 만든다. 예로 들어서 악성 프로세스가 목록에 나오지 않게 해주거나 아니면 실제 악성코드 행동을 하기도 하는 등, 용도가 많다.
[1] TempleOS와 같이 Ring0으로만 작동하는 운영체제들은 예외[2] Ring는 '보호 링'이라고 하며, CPU의 기능이다. 기본적으로 운영체제는 컴퓨터의 모든 값을 읽고 쓸 수 있다. 하지만 운영체제에서 돌아가는 프로세스도 운영체제와 똑같이 할 수 있게 하면, 안정성 및 보안성의 문제가 뒤따를 수 밖에 없기 때문에 운영체제는 CPU의 기능인 보호 링을 사용하여, 커널 모드와 사용자 모드를 나누게 된다. 거의 모든 운영체제들은 커널 모드는 Ring0에, 사용자 모드는 Ring3에 두는 것이 일반적이며, Ring1~2는 사용하지 않는다.[3] ntdll.dll의 접두사 중에서 '''Nt 또는 Zw'''가 있는데, 이 그룹들은 바로 시스템 호출이다. 이들 함수가 호출되면 커널 모드에 들어가서 SSDT를 통해 같은 의미를 가진 ntoskrnl.exe의 함수를 호출한다.