HOW TO HACK/Basics

해커라면 알아야 할 리눅스 기초-11 : 커널 모듈(Kernel Module) 적재, 제거 등

Mr. Rootable 2016. 4. 22. 10:27

# 본 게시글은 작성자 본인의 스터디한 내용을 바탕으로 작성된 글입니다.


# 본 게시글에는 일부 잘못된 정보가 포함되어있을 수 있습니다.


# 이 글을 열람하는 것은 위 사항에 동의하는 것으로 간주합니다.


# 잘못된 정보에 대한 예의바른 태클 및 지적질 적극 환영합니다.





오늘은 리눅스의 커널(kernel) 모듈에 대해 얘기를 해보려고 한다.

컴퓨터를 좀 다뤄봤거나, 심지어 정보처리기사같은 자격증 서적만 봐도 나오는게 이 커널이다. 

지금부터는 이전의 포스팅에 비해 리눅스에 대한 심도있는 이해가 필요한 부분이지만 굳이 여기서 파고들어가진 않을꺼다. 



Step 1 : 커널 모듈이란?



"더 커널"이라는 영국의 페일에일 맥주이다. 

향과 맛이 강하다고 소개되는데, 직접 마셔보진 못했다. 알파산도(Alpha acid,AA)가 무려 13.3%~16.3%로 꽤 쓴맛이 강하단다.

원래는 stella라는 이름이었으나, 맥주의 핵심이자 중점이 되고 싶다는 의미로 맥주 이름을 커널이라고 지었다는 풍문도 있다.

한번은 마셔보고 싶은 맥주이다... 뭐.. 술은 언제나 마셔보고 싶지만 ㅋㅋㅋ 암튼 그랬다고 한다....  (^__^)/

근데 난데없이 왠 맥주냐? 맥주의 핵심!!!!  핵심!!!! 핵심!!!!!

그렇다. 칼리리눅스, 우분투를 비롯한 모든 리눅스 운영체제의 핵심이 바로 커널(Kernel)다. (물론 윈도우와 리눅스에도 커널이 있다.)

커널은 아래 그림을 보면 알겠지만 운영체제와 하드웨어 사이에서 시스템의 자원을 관리하며 모든 시스템이 원활하게 동작할 수 있도록 제어하는 일종의 소프트웨어이다. 또한 DRAM에 상주하여 시스템의 구동에 필요한 환경설정과 수행되는 프로그램을 스케쥴링한다.



(출처 : midas NFX 사이트 (http://nfx.co.kr/techpaper/keyword_view.asp?pg=1&sk=&bid=70&nCat=&nIndex=k&sHtml=&idx=358))

                                            <그림. 컴퓨터 내부구조>


커널은 CPU, 메모리, 하드웨어와 어플리케이션 사이에서 동작하면서 프로세서 관리, 메모리 관리, 파일시스템 관리, 네트워크 관리, 각종 디바이스 관리 기능을 수행한다. 운영체제에서 일어나는 모든 부분을 관리하고, 신규 디바이스 드라이버나 파일시스템 드라이버 등을 위해 업데이트가 필요할 때도 있다. 간단한 방법으로 필요한 커널 모듈을 로드(load) 및 언로드(Unload)할 수 있다.



Step 2 : 커널 정보 확인


현재 리눅스의 커널이 무엇인지 확인해보자.

커널을 확인하기 위한 방법에는 두 가지가 있다.


첫 번째 방법은 uname 명령어를 통한 확인이다.

uname 명령어는 시스템에 대한 정보를 출력해주는 역할을 하며, 하드웨어 타입, 호스트명, 운영체제 릴리즈 번호 등의 정보를 확인할 수 있다.


사용가능한 옵션은 다음과 같다.


-a : 모든 정보 출력

-m : 하드웨어 타입 출력

-n : 호스트명 출력

-r : 운영체제의 릴리즈 번호 출력

-s : 운영체제 이름 출력
-v : 운영체제 버전 출력


옵션없이 사용하게 되면 단지 OS가 무엇인지 알려준다.

우리는 모든 정보를 출력해주는 -a 옵션을 사용해 볼 것이다.


# uname -a



현재 시스템의 버전 정보를 알 수 있는 또 다른 방법은 /proc 디렉토리안의 파일을 활용하는 방법이다.

/proc 디렉토리에는 실행중인 프로세스, CPU, 메모리 등의 시스템 정보가 파일로 저장되어있으며,

이 /proc 디렉토리에는 아래와 같은 시스템 정보들이 있다. 


 (출처 : http://blog.naver.com/shadowbug/220480815035)

                                             <표. /proc 디렉토리의 시스템 정보 파일> 


위의 표를 살펴보면 현재 커널의 버전을 확인할 수 있는 파일은 /proc/version이다.

해당 파일을 cat 명령어를 통해 출력해보자.


# cat /proc/version




Step 3 : 커널 튜닝 (sysctl 명령어, /etc/sysctl.conf 파일)


리눅스 시스템의 관리자들은 가끔씩 메모리 할당 변경, 네트워크 기능 활성화 등을 위해 커널 튜닝을 하기도 한다.

커널 튜닝은 sysctl 명령어를 사용하며, sysctl 명령어는 런타임(Runtime) 중에 커널의 파라미터를 변경할 때 사용하는 명령어이다.


사용법 : sysctl [옵션] 파일명 혹은 파일명=값


옵션

-a : 현재 커널 매개변수와 값을 출력

-p : sysctl 환경변수 파일의 설정 상태 출력

-n : 특정키에 대한 값을 출력

-w variable-value: 변수(vaiable)에 값(value)을 설정

-A : 테이블 형태로 설정가능한 파라미터를 출력


# sysctl -a | grep kernel



각종 커널 파라미터들에 설정된 값을 확인할 수 있다.

이 커널 파라미터의 값을 임시로 변경하려면 sysctl 명령어를 -w 옵션과 함께 사용한다.

커널 파라미터 kernel.sysrq의 값을 변경해보자. 아래 명령어를 실행해보자.(-w 옵션 사용법은 위에 쓴 내용 참고하셈)


# sysctl -w kernel.sysrq="1"



kernel.sysrq 파라미터의 값이 1로 변경되었다.


하지만 위의 방법으로 변경한 커널 파라미터의 값은 시스템이 재부팅되면 다시 원래대로 변경된다.

즉, 1회성이라는 말이다.

변경한 값을 재부팅 후에도 유지되게려면 /etc/sysctl.conf 파일에 있는 커널 파라미터를 직접 수정해야 한다.

수정을 하고나면 sysctl -p 명령어를 통해 변경내용을 Commit 해야 한다.


# vim /etc/sysctl.conf

# sysctl -p


이 sysctl 명령어는 해커가 중간자공격(Man-In-The-Middle Attack)을 목적으로 ipforwarding을 활성화하기 위해 사용할 수 있다.

또한, 방어 관점에서는 해킹을 보다 어렵게 하기 위해 ICMP echo request를 Disable 하는데 사용하기도 한다.



Step 4 : 커널 모듈들 (lsmod, insmod, rmmod, modprobe)


커널을 관리하기 위한 명령어로는 바로 lsmod와 insmod, rmmod 명령어가 있다.


lsmod는 로드된 모든 커널 정보를 보여주는 명령어이다.

다음 명령어를 터미널에서 실행해보자.


# lsmod



모듈이름, 크기, 사용횟수, 언급된 모듈의 리스트를 출력해주며, 

이 정보는 /proc 디렉토리에 저장된 modules 파일과 동일한 정보이다.


insmod는 모듈을 적재하는 명령어이며, 실행중인 커널에 모듈을 설치하는 역할을 한다.


사용법 : insmod [옵션] [오브젝트파일]

옵션 

-kautoclean(모듈에 자동 제거 플래그를 설정)을 사용하여 적재한다. 

     모듈이 일정시간 이상 사용되지 않으면 kerneld(8)이 모듈을 제거할 수 있도록 한다.


rmmod는 실행중인 커널로부터 로드된 모듈을 언로드(Unload)한다.


사용법 : rmmod [옵션] [모듈]

옵션 

-r : 의존관계에 있는 모듈을 한번에 언로드한다.


최근의 리눅스 배포판에는 modprobe 명령어가 있다.

이 명령어 역시 LKM(Loadable Kernel Module)을 커널에 추가하거나 제거하는데 사용한다.<끝>