1. 소개
필자는 System Hacking에 관한 공부를 진행하며 기본적인 stack과 관련된 취약점, heap exploit, vtable 과 관련된 정보는 한글로 된 정보도 많고 예제도 많기 때문에 충분히 실습과 이론적인 공부를 하기 어렵지 않았다.
그런데, 최근 Linux Kernel에 관심을 갖게 되며 공부를 진행하던 중 Kernel에 관한 정보와 이론은 영어나 외국어로 작성되어 있는 자료가 많았고, 한국어 자료의 경우 찾기 어렵거나 일부 블로그의 정보만으로는 공부하기가 쉽지 않다. 그래서 여러 레퍼런스 자료들을 참고하고 실습하며 Kernel 이론 부터 exploit 까지 블로그로 작성해보려한다.
2. 레퍼런스
전반적인 내용은 Pwanyable blog에 기초를 두고 작성하겠다.
https://www.redhat.com/ko/topics/linux/what-is-the-linux-kernel
3. 커널이란?
Linux System은 크게 3가지 레이어로 구성되어 있으며 각각의 레이어는 다른 레이어를 덮고 있는 조개 껍질과 같은 구조로 되어있다.
CPU와 같은 Hardware를 Kernel이 감싸고있고, 이 Kernel을 Shell이라는 우리가 사용하는 Interface가 감싸고 있다.
(본 설명은 이해를 돕기위한 예시일 뿐, 실제 작동 원리는 감싸고 있다는 표현과는 좀 다르다.)
여기서 우리가 사용하는 Shell 은 하드웨어와 직접적으로 명령을 내리고 결과를 받아올 수 없기 때문에 Kernel이 이를 관리하고 통역과 같은 역할을 해준다.
또 커널은 생각보다 많은 일을 담당하고 있는데 그중 대표적인 것이 보안, 자원 관리, 명령 전달 및 결과 전달이다.
- 보안
커널은 하드웨어와 프로세스의 관리를 담당하는 만큼 프로세스 공간에서 커널 공간 혹은 다른 프로세스 공간에 대한 간섭을 방지함과 동시에 프로세스 공간에서 커널 공간으로의 직접적인 엑세스도 차단한다.
또, 프로세스에 할당되지 않은 메모리 영역에 침범 하려는 경우에도 세그먼트 오류를 발생시켜 시스템의 가상 메모리를 보호하는 등 이외에도 Seccomp, 사용자 권한 관리, 서명되지 않은 프로그램 실행 방지 등의 보안을 담당한다. - 자원 관리
커널은 하드웨어의 무제한 액세스가 가능한 반면, 프로세스 공간에서는 할당된 한정적인 자원만 사용이 가능하다.
이때 프로세스 공간에 자원을 할당해 주는것이 커널이며 물리적 하드웨어 장치들을 추상화하여 Task, Segement 와 같은 자원들로 제공하는 역할을 하고 있다. - 명령 전달 및 결과 전달
우리가 사용하는 명령어 들은 하드웨어가 직접적으로 해석하고 연산을 진행할 수 없다. 그래서 쉘에 명령어를 입력하면 이를 해석하여 커널에 전달하고 커널은 이를 하드웨어에 전달한다. 하드웨어에서 연산이 진행되고 나면 결과 값을 커널이 받아오고 이를 다시 쉘로 넘기며 유저가 알아볼 수 있는 형태로 화면에 나타나게 되는 것이다.
그럼 커널을 우리가 사용하려면 어떻게 해야할까?
프로그램 코드를 실행할 때 기본적으로 두 가지의 모드로 나뉘는데, 사용자 모드와 커널 모드이다.
사용자 모드는 각 프로세스에서 코드가 실행되며 한정적인 자원 내에서 명령을 수행한다. 커널 모드에서는 커널 모듈들과 커널 함수들을 사용하여 사용자 공간과 격리된 공간에서 syscall 과 같은 명령을 수행한다. 어셈블리어의 int 0x80, syscall을 통해 open, read, write, sigreturn 과 같은 작업이 커널 모드에서 진행 되는 함수들이다.
이외에도 직접적으로 커널 모드로 전환하는 코드를 명시하면 커널 공간에서 코드를 실행할 수 있다.
4. 마치며
여기 까지 Linux Kernel에 대해 간략하게 알아보았다. 필자는 Kernel Exploit에 중점을 두기 때문에 커널에 대해 더 깊게 설명하진 않고 필요한 경우 글마다 첨삭할 예정이다.
위에서 알아보았듯이 커널은 사용자 권한을 관리 하는 만큼 Exploit은 권한 상승을 주 목적으로 한다. 다음 글에선 기본 환경 세팅에 대해서 알아보도록 하자.
'Kernel' 카테고리의 다른 글
[Kernel] KROP & KPTI (0) | 2024.03.15 |
---|---|
[Kernel] Kernel Stack Overflow & Commit_creds (0) | 2024.02.18 |
[Kernel] Holstein Module (1) | 2024.02.12 |
[Kernel] 커널의 보호 기법 (1) | 2024.01.04 |
[Kernel] qemu를 사용한 환경 세팅 (1) | 2023.12.18 |