Information Security

시스템 콜(System Call) 본문

System Hacking

시스템 콜(System Call)

leeeeye321 2018. 1. 25. 04:01

System Call

-커널은 하드웨어 특성으로부터 프로그램들을 격리시키고, 하드웨어와 직접 상호 작동하며 프로그램에게 일관된 서비스를 제공한다.

-Shell(user)은 정의된 System Call에 의해서 커널과 통신한다.

 

1. C 언어에서 시스템 콜 사용

-라이브러리에 이미 시스템 콜과 동일한 Wrapper 함수가 존재한다.

 

printf 함수 대신에 write 시스템 콜 함수를 이용해서 문자열을 출력할 것이다.

 

# man 2 write

-> write 함수의 원형 확인

 

write(fd, 출력할 문자열, 문자열의 개수)

-> fd = file descriptor

 

-> fd : 1(표준 출력)

-> 공백, 개행 문자 포함 문자열의 개수 : 13

 

 

2. 어셈블리어에서 시스템 콜 사용

-어셈블리어에서는 호출을 통한 시스템 콜 함수를 사용하지 않는다.

-> C 라이브러리를 사용하지 않고 프로그램을 작성한다.

-인터럽트(Interrupt)를 통해서 시스템 콜 함수를 사용할 것이다.

 

https://syscalls.kernelgrok.com/

이 사이트에 시스템 콜의 번호와 인자에 대한 설명이 나와있다. 이를 참고해서 프로그램을 작성한다.

 

함수를 검색해본 결과 레지스터를 통해서 인자를 전달해야 하는 것을 알 수 있다.

 

※ 라이브러리를 사용하지 않기 때문에 extern을 사용하지 않아도 된다.

-> text 세그먼트에서 entry point는 main 대신에 _start를 사용해야 한다.

 

eax : 시스템 콜 번호 4

 

write(1, "Hello World!\n", 13);

ebx : fd = 1

ecx : 입력할 문자열의 주소

edx : 문자열의 개수

-> 위의 표를 보고 각 레지스터에 정보를 넣어준다.

-> 레지스터를 통해 인자를 전달하고, int 80h로 시스템 콜 인터럽트를 발생시킨다.

 

컴파일 후 ld 명령어로 링크를 해주면 hello 프로그램을 실행할 수 있다.