- System call 이란 사용자 프로세서가 소프트웨어 인터럽트를 통해 커널의 기능을 이용하기 위한 서비스를 요청하는 하나의 방법입니다.
- 응용프로그램에서 운영체제에게 어떠한 기능(시스템 자원)을 수행해 달라고 하는 하나의 수단입니다.
- 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근 하기 위한 인터페이스입니다.
- 매개변수를 전달할 때 대부분의 환경에서 매개변수를 CPU 레지스터를 통해 전달합니다.
- 레지스터를 이용해서 인자를 설정하고 시스템 콜 함수를 호출합니다.
32bit system call table 확인
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86-32_bit
64bit system call table 확인
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86_64-64_bit
32bit 환경에서는 int 0x80 이라는 어셈블리 명령어를 통해 시스템 콜 호출이 가능합니다
$eax는 시스템 콜 Number를 뜻합니다.
ex) write 를 syscall 하고 싶다면,
$eax = 0x04
$ebx = 1번째 인자 (unsigned int fd)
$ecx = 2번째 인자 (const char *buf)
$edx = 3번째 인자 (size_t count)
위와 같이 레지스터를 세팅해주고 int 0x80으로 시스템 콜을 호출해주면 됩니다.
System call 호출 - 64bit
64bit 환경에서는 syscall 이라는 어셈블리 명령어를 통해 시스템 콜 호출이 가능합니다.
$rax는 시스템 콜 Number를 뜻합니다.
ex) write 를 syscall 하고 싶다면,
$rax = 0x01
$ebx = 1번째 인자 (unsigned int fd)
$ecx = 2번째 인자 (const char *buf)
$edx = 3번째 인자 (size_t count)
위와 같이 레지스터를 세팅해주고 syscall으로 시스템 콜을 호출해주면 됩니다.