본문 바로가기
System_Security

08. 시스템 콜

by Jnamelight 2017. 8. 1.

시스템 콜 ( system call ) 이란 리눅스에서 사용되는 용어로써 간단하게 설명하자면


		         ( 보 호 )
user ( Shell ) 	   |	   kernel     |	      H/W
		     핵심기술을 다룸
		   (파일, 장치, 프로세스 관리)
		  즉 사용자와 하드웨어를 연결


위와같은 형식으로 되어있을 경우 user 가 kernel 에 콜을 해주는 것을 시스템 콜이라고 한다. 


그럼 kernel 은 하드웨어에 접근하여 해당 명령어를 실행시켜주게 된다.


즉 사용자와 , 하드웨어의 연결을 해주는 명령어를 시스템 콜이라고 한다.


위의 용어는 리눅스지만, widows 역시 시스템 콜과 같은 API 가 존재한다. API 은 윈도우용 시스템 콜이라고 생각하면 된다.





시스템 콜을 공부하기에 앞서 유용한 명령어 두가지를 알아보자.


1. ltrace : library tracing ( 라이브러리 추적)


2. strace : system call tracing ( 시스템 콜 추적 )


execve("./a.out", ["./a.out"], [/* 22 vars */]) = 0
brk(0)                                  = 0x8049548
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26952, ...}) = 0
old_mmap(NULL, 26952, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40015000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=4101324, ...}) = 0
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\210\212"..., 4096) = 4096
old_mmap(NULL, 1001564, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4001c000
mprotect(0x40109000, 30812, PROT_NONE)  = 0
old_mmap(0x40109000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xec000) = 0x40109000
old_mmap(0x4010d000, 14428, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4010d000
close(3)                                = 0
mprotect(0x4001c000, 970752, PROT_READ|PROT_WRITE) = 0
mprotect(0x4001c000, 970752, PROT_READ|PROT_EXEC) = 0
munmap(0x40015000, 26952)               = 0
personality(PER_LINUX)                  = 0
getpid()                                = 833
fstat64(0x1, 0xbffff394)                = -1 ENOSYS (Function not implemented)
fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40015000
ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0


여기서부터가 메인에서 호출

write(1, "Hello, World!\n", 14Hello, World!
)         = 14
munmap(0x40015000, 4096)                = 0
_exit(0)                                = ?


이두가지 명령어를 통해 알 수 있는 사실은 라이브러리와 시스템 콜은 다르다는 것이다.


정리하면 라이브러리는 시스템 콜을 더 쉽고 유용하게 사용할 수 있도록 만들어진 도구 같은 것이다.




시스템 콜은 따로 메뉴얼이 존재하지 않는다. 


그래서 사이트를 보통 참고하는대 

 http://www.lxhp.in-berlin.de/lhpsyscal.html

위의 사이트가 정리가 잘되어 있다고 한다.



그럼 위의 사이트의 내용을 이용해서 이제 C 라이브러리를 이용하지 않고 순수 시스템콜을 이용해서 코드를 작성해보자.



[실습1]

표준입력으로 입력받은 문자열을 
거꾸로 출력하는 어셈블 프로그램을 작성
segment         .data

segment         .bss
input           resb    1024
tmp             resb    1024
num             resb    1

segment         .text
global  _start

_start:
        mov     eax,    3
        mov     ebx,    0
        mov     ecx,    input
        mov     edx,    1024
        int     0x80

        mov     ebx,    input
        mov     ecx,    num
        mov     byte [ecx],     1
count:
        mov     eax,    [ebx]
        cmp     eax,    00
        je      L5
        add     ebx,    1
        add     byte [ecx],     1
        jmp     count

L5:
        mov     eax,    tmp
        mov     ecx,    input

swap:
        mov     edx,    [ebx]
        mov     [eax],  edx
        cmp     ecx,    ebx
        jge     end
        sub     ebx,    1
        add     eax,    1
        jmp     swap

end:
        add     eax,    1
        mov     byte [eax],     10


        mov     eax,    4
        mov     ebx,    1
        mov     ecx,    tmp
        mov     edx,    [num]
        add     edx,    1
        int     0x80





        mov     eax,    1
        mov     ebx,    0
        int     0x80

실습2.

  - 표준입력으로 경로명을 입력받아서 입력받은 경로로
    디렉토리를 생성하는 어셈블 프로그램을 작성


segment         .data

segment         .bss
read_msg        resb    100
tmp             resb    100
num             resb    1

segment         .text
global  _start

_start:
        mov     eax,    3
        mov     ebx,    0
        mov     ecx,    read_msg
        mov     edx,    100
        int     0x80

        mov     eax,    read_msg
        mov     ebx,    num
        mov     byte [ebx],     0
L3:
        cmp     byte [eax],     00
        je      L5
        add     byte [ebx],     1
        add     eax,    1
        jmp     L3
L5:
        mov     eax,    read_msg
        mov     ebx,    [num]

        sub     ebx,    1

        add     eax,    ebx
        mov     byte [eax],     0

        mov     eax,    39
        mov     ebx,    read_msg
        mov     ecx,    0
        int     0x80

        mov     eax,    1
        mov     ebx,    0
        int     0x80




실습3.

  - 표준입력으로 파일의 경로를 입력받아서
    파일의 내용을 출력하는 어셈블 프로그램을 작성

segment         .data

segment         .bss

read_msg        resb    100
fd              resb    1
file_msg        resb    1024


segment         .text
global  _start

_start:
        mov     eax,    3
        mov     ebx,    0
        mov     ecx,    read_msg
        mov     edx,    100
        int     0x80

        mov     eax,    read_msg
        mov     ebx,    0
L3:
        cmp     byte [eax],     0
        je      L5
        add     eax,    1
        add     ebx,    1
        jmp     L3

L5:
        mov     eax,    read_msg
        sub     ebx,    1
        add     eax,    ebx
        mov     byte [eax],     0


        mov     eax,    5
        mov     ebx,    read_msg
        mov     ecx,    00
        mov     edx,    777
        int     0x80

        mov     [fd],   eax

        mov     eax,    3
        mov     ebx,    [fd]
        mov     ecx,    file_msg
        mov     edx,    1024
        int     0x80

        mov     eax,    4
        mov     ebx,    1
        mov     ecx,    file_msg
        mov     edx,    1024
        int     0x80

        mov     eax,    1
        mov     ebx,    0
        int     0x80





'System_Security' 카테고리의 다른 글

10. 기계어 -> C 복원 연습  (0) 2017.08.03
09. 디버거  (0) 2017.08.03
07. 메인 함수  (0) 2017.08.01
06. 프로세스 메모리 구조  (0) 2017.07.26
05. 분기문,반복문  (0) 2017.07.24

댓글