본문 바로가기

System Hacking

정보보안5 (13,14,15) - 시스템 콜 (systemcall)

2. 시스템 콜

시스템 호출(system call)은 운영 체제의 커널이 제공하는 서비스이다.

응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.

보통 c나 c++같은 고급언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다.

- 리눅스 : 시스템 콜 (커널이 제공)

- 윈도우즈 : WIN API

 

 

ssize_t write(int fd, const void *buf, size_t count);

---> write systemcall의 구조

위와같이 시스템 콜을 직접이용하여 작성하면 되는데,

구글에 systemcall tables를 검색하여 고유의 번화와 각각레지스터의 인자값을 적절히 넣으면 된다. return값이 있는경우 eax에 저장된다.

 

write 시스템콜은 레지스터에 저장하여 사용할 수 있다.

eax --> 4( 고유번호 ==write )

ebx --> 첫번째 인자

ecx --> 두번째 인자

edx --> 세번째 인자

int    80h ---> 호출하는 명령어 interupt

 

eax --> 시스템 콜번호저장, 리턴 값, 연산

 

systemcall table을 검색하면 다음과같이 고유번호와 각각 인자의 타입이나온다.

! 유용한 명령어

1. ltrace

- 실행 프로그램에서 사용중인 c 라이브러리 추적

2. strace

- 실행 프로그램에서 사용중인 시스템 콜을 추적 

 

 

 

[실습] 시스템콜을 이용한 여러가지 프로그램 작성.

 

1. mymkdir 프로그램을 작성

#> ./mymkdir

path: mydir

success mkdir

 

#> ./mymkdir

path: mydir

fail    mkdir

 

system call: read, wirte, mkdir

 

! read systemcall은 뉴라인까지 입력을 받는다.

! read systemcall은 읽어들인 문자열의 길이를 eax에 반환한다.

! 메모리는 지역변수만 사용

! 다른 c 표준 함수는 사용하지 않는다.

 

int main()

{

 char path[1024];

 int len = 0;

 

 write( 1, "path: ", 6 );

 len = read( 0, path, 1024 );

 path[len-1] = 0

 

ret = mkdir( path, 0755 );

if (ret != 0 ) {

write( 1, "failed mkdir", 6 );

}

else

{

write( 1, "success mkdir", 8 );

}

 

 return 0;

}

 

 

 

 

2. mycat 만들기

 

#> ./mycat

file: /etc/passwd

...

 

systemcall: open, read, write

()는 플래그 번호를 뜻한다.

 

c언어로 나타내면 다음과 같다.

 

 

 

 

 

3. myshell

int main()
{
 chat path[1024] = {0,};
 int len = 0;
 int ret = 0;

 write(1, "cmd: ", 5 );
 len = read( 0, path, 1024 );
 path[len-1] = 0;

 char *shell[2] = {0,};

 shell[0] = "/bin/ls";
 shell[1] = 0;

 execve( shell[0], shell, 0 )

}