Information Security
시스템 콜(System Call) 본문
System Call
-커널은 하드웨어 특성으로부터 프로그램들을 격리시키고, 하드웨어와 직접 상호 작동하며 프로그램에게 일관된 서비스를 제공한다.
-Shell(user)은 정의된 System Call에 의해서 커널과 통신한다.
1. C 언어에서 시스템 콜 사용
-라이브러리에 이미 시스템 콜과 동일한 Wrapper 함수가 존재한다.
printf 함수 대신에 write 시스템 콜 함수를 이용해서 문자열을 출력할 것이다.
# man 2 write
-> write 함수의 원형 확인
write(fd, 출력할 문자열, 문자열의 개수)
-> fd = file descriptor
-> fd : 1(표준 출력)
-> 공백, 개행 문자 포함 문자열의 개수 : 13
2. 어셈블리어에서 시스템 콜 사용
-어셈블리어에서는 호출을 통한 시스템 콜 함수를 사용하지 않는다.
-> C 라이브러리를 사용하지 않고 프로그램을 작성한다.
-인터럽트(Interrupt)를 통해서 시스템 콜 함수를 사용할 것이다.
https://syscalls.kernelgrok.com/
이 사이트에 시스템 콜의 번호와 인자에 대한 설명이 나와있다. 이를 참고해서 프로그램을 작성한다.
함수를 검색해본 결과 레지스터를 통해서 인자를 전달해야 하는 것을 알 수 있다.
※ 라이브러리를 사용하지 않기 때문에 extern을 사용하지 않아도 된다.
-> text 세그먼트에서 entry point는 main 대신에 _start를 사용해야 한다.
eax : 시스템 콜 번호 4
write(1, "Hello World!\n", 13);
ebx : fd = 1
ecx : 입력할 문자열의 주소
edx : 문자열의 개수
-> 위의 표를 보고 각 레지스터에 정보를 넣어준다.
-> 레지스터를 통해 인자를 전달하고, int 80h로 시스템 콜 인터럽트를 발생시킨다.
컴파일 후 ld 명령어로 링크를 해주면 hello 프로그램을 실행할 수 있다.
'System Hacking' 카테고리의 다른 글
버퍼 오버플로우 취약점 확인 + 메모리 변조 실습 (0) | 2018.01.31 |
---|---|
시스템 콜을 이용한 mkdir 프로그램 작성 (0) | 2018.01.28 |
main 함수의 인자 argc, argv (0) | 2018.01.24 |
함수 (0) | 2018.01.23 |
관계 연산(cmp) + 제어문 (0) | 2018.01.19 |