Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/Analysis

Linux Kernel 코드 분석 첫걸음

Ainsetin 2021. 11. 9. 10:07

Dreamhack kpwnote를 풀고 나서 더이상 커널 모듈이나 코드에 대한 분석 및 Exploit을 진행해본 적이 없어 한번 제대로 분석 노트를 만들어 분석 과정을 정리해 봐야겠다는 생각에 이 글을 쓰게 되었다. 또한 현재 진행하고 있는 Kernel CVE Analysis에도 도움이 될 것이다.

 

kernel source의 위치는 다음과 같이 /usr/src 안에 있음을 확인할 수 있으며, 폴더 이름만으로 어떤 커널 버전을 사용하고 있는지 알 수 있다. 또한, 여기 존재하는 버전을 통해 컴파일을 하여 Ubuntu가 구동되고 있는 상태라고 생각하면 된다.

 

Ubuntu LTS Version 같은 경우 다음과 같이 버전별 사용하는 kernel 버전에 차이가 있다. 위의 버전을 보면 알겠지만, 나는 Ubuntu 16.04 + 4.4.0-31 kernel을 사용하는 것을 알 수 있다. 현재 커널같은 경우 특정한 0-day 취약점을 가지고 있어 특정 CVE 취약점 공격 실습이 가능하다.

 

우선 kernel같은 경우 미리 세팅된 architecture 폴더의 종류가 매우 다양한 편이다.

(arm, mips, powerpc, x86, ..)

이렇게 여러 CPU 아키텍처에 대한 코드가 내장되어 있어 어느 아키텍처에서 돌아가든 호환이 가능한 것이다.

 

다음과 같이 drivers 폴더에는 드라이브 관련 소스의 경로가 담겨 있다.

 

init 폴더에는 커널의 초기 상태를 세팅하는 코드(Kconfig, Makefile)가 들어 있다.

 

include 폴더에는 각종 파일 구조체와 대체 함수 이름이 들어 있는 헤더 파일을 저장한다.

 

mm(memory management) 폴더같은 경우 서로 다른 아키텍처에 대한 메모리 관리 방식이 다르기 때문에 이를 제어하기 위해 존재한다.

 

커널의 메인 소스가 들어 있으며, 스케줄러 역할을 하는 kernel 폴더이다. 가장 중요한 폴더라고 할 수 있다.

 

Makefile로 모든 소스를 컴파일하여 지금과 같이 Ubuntu 16.04.1을 4.4.0 version의 kernel로 구동하고 있을 것이다.

나머지 같은 경우 소스를 천천히 분석하면서 설명을 덧붙이겠다.