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 )
}
'System Hacking' 카테고리의 다른 글
3일차] 보안가이드[파일 및 디렉터리 관리] (2) | 2018.04.12 |
---|---|
1~2일차] 보안 가이드[계정관리] (0) | 2018.04.11 |
정보보안5 (16) - 디버거 (0) | 2017.11.02 |
정보보안5 (12) - main함수의 인자 (0) | 2017.10.30 |
정보보안5 (10,11) - call, 스택메모리의 함수표현 (0) | 2017.10.26 |