시스템 콜 ( 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 |
댓글