시스템 해킹을 공부를 하다보면, 시스템 호출 (System Call)에 대해 정리를 하고자 이번 포스팅을 작성을 하게 되었습니다.
시스템 호출 (System Call) 이란?
컴퓨터의 운영 체제(OS)에서 제공하는 중요한 인터페이스입니다. 시스템 호출은 응용 프로그램이 하드웨어 리소스와 다양한 운영 체제 서비스에 접근할 수 있도록 합니다. 사용자 프로그램과 운영 체제 커널 간의 통신 메커니즘을 제공을 합니다.
시스템 호출 (System Call) 기능
1. 운영 체제 서비스 호출 : 사용자 프로그램이 운영 체제가 제공하는 서비스를 사용을 할 수 있도록 합니다.
ex) 파일 시스템 접근, 네트워크 통신, 메모리 관리 등 다양한 기능을 시스템 호출 (System Call)을 통해 사용할 수 있습니다.
2. 프로세스 관리 : 프로세스 생성, 종료, 스케줄링 등과 같은 프로세스 관리 기능을 제공합니다.
3. 하드웨어 리소스 접근 : 하드웨어 디바이스 드라이버를 통해 하드웨어 리소스에 접근할 수 있는 인터페이스를 제공합니다.
ex) 파일을 읽고 쓰기 위해 디스크 드라이버에 대한 시스템 호출을 사용할 수 있습니다.
4. 보호 메커니즘 : 운영 체제는 시스템 호출을 통해 사용자 프로그램이 하드웨어 리소스에 직접 접근하는 것을 제한하고, 보안 및 권한 관리를 수행합니다.
시스템 호출 (System Call) 의 예시
고유한 번호 와 인자들을 전달을 하여 호출이 됩니다. 리눅스 시스템에서는 'open' 시스템 호출은 파일을 열기 위해 사용이 됩니다.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd = open("file.txt", 0_RDONLY);
if (fd == -1)
{
perror("open");
return 1;
}
close(fd);
return 0;
}
'open' 시스템 호출은 파일 'file.txt"를 읽기 전용으로 열고, 파일 디스크립터('fd')를 반환합니다. 'open' 호출은 파일 이름과 열기 모드('0_RDONLY' 등)를 인자로 전달받으며, 이를 통해 파일을 열 수 있씁니다.
파일 디스크립터 (File Descriptor, FD) 란 ?
운영체제에서 파일 또는 입출력 리소스를 식별하는데 사용되는 정수이다. 파일 디스크립터는 프로세스가 파일, 파이프, 소켓 등과 같은 다양한 리소스에 접근할 수 있도록 하는 중요한 역할을 한다.
기본 파일 디스크립터
운영 체제는 일반적으로 프로세스에 대해 다음과 같은 기본 파일 디스크립터를 제공한다.
0 : 표준 입력 (stdin) - 입력을 받는 디바이스 또는 파일
1 : 표준 출력 (stdout) - 출력을 보내는 디바이스 또는 파일
2 : 표준 오류 출력 (stderrr) - 오류 메시지를 보내는 디바이스 또는 파일