본문 바로가기

High Level Technique/Shellcoding

System Call

System Call


앞서 포스팅 된 Hello World 소스코드를 분석하기 위해서는 System Call을 이해해야 합니다. 그럼 System Call에 대해서 알아보도록 하겠습니다.






System Call이란?


시스템 콜은 운영체제가 인식하여 실행하기 위한 것 이라고 생각하면 쉽습니다.

32비트와 64비트의 시스템 콜은 다르기 때문에 아래 내용을 확인해 보도록 하죠.


x86 System Call Table: http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

x64 System Call Table: http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64



위 사이트의 표를 일부 확인해 보도록 하죠.

%eax

NameSource%ebx%ecx%edx%esx%edi
1sys_exitkernel/exit.cint----
2sys_forkarch/i386/kernel/process.cstruct pt_regs----
3sys_readfs/read_write.cunsigned intchar *size_t--
4sys_writefs/read_write.cunsigned intconst char *size_t--
5sys_openfs/open.cconst char *intint--
6sys_closefs/open.cunsigned int----
7sys_waitpidkernel/exit.cpid_tunsigned int *int--
8sys_creatfs/open.cconst char *int---
9sys_linkfs/namei.cconst char *const char *---
10sys_unlinkfs/namei.cconst char *----



exit를 실행하기 위해서 eax는 1 ebx는 int값이 들어가야 한다는 말입니다.

마찬가지로 wirte를 실행하기 위해서 eax에 4, ebx에 unsigned int ecx에 cosnt char*, edx에 size_t 값이 들어가야 한다는 것입니다.


좀 더 쉽게 이해하기 위해서 HelloWorld.nasm 소스코드를 분석해보도록 하겠습니다.







소스코드 분석



5 : 4를 eax에  저장합니다.

6 : 1을 ebx에 저장합니다.

7: ecx에 helloworld 주소를 저장합니다.

8 : edx에 helloworld_len 값을 저장합니다.

9 : 커널에 해당 정보를 넘겨줍니다.


17 : helloworld라는 이름에 "Hello World!", 0xA라는 정보를 저장합니다.

18 : helloworld_len라는 이름에 $-helloworld 값을 저장합니다.

$-helloworld는 문자열의 길이를 계산합니다. 여기서 $는 17줄의 "Hello World!",0xA↓ 화살표 위치라고 생각하면 쉽습니다.

즉, 화살표 부터 helloworld 까지 거리를 계산합니다.




5줄부터 9줄까지 각 레지스터에 저장하여 커널에 정보를 넘겨줍니다. System Call을 확인하면 wirte()를 실행한다는 것을 알 수 있습니다. 이렇게 각 레지스터에 어떤 정보를 넣어야 하는지 확인하기 위해 System Call Table을 확인해야 합니다.


마찬가지로 11줄 부터 13줄은 exit()를 실행시키는 코드가 되는 것이죠.







마찬가지로 64비트도 위와 같은 방식으로 작성하면 됩니다.

'High Level Technique > Shellcoding' 카테고리의 다른 글

Section  (0) 2016.03.11
출력과 입력  (0) 2016.03.11
Hello World  (0) 2016.03.11
IA-32, IA-64 Register  (0) 2016.03.11
Assembly Language  (0) 2016.03.11