Computer Security

#1 리눅스 커널 1 본문

리눅스 커널 해킹

#1 리눅스 커널 1

쿠리 Kuri 2022. 8. 9. 18:30
반응형

리눅스 커널

  • 오픈 소스 모놀리딕 유닉스 계열 컴퓨터 운영 체제 커널이다. 
  • 리눅스 계열의 운영 체제는 이 커널에 기반을 두며 개인용 컴퓨터와 서버와 같은 전통적인 컴퓨터 시스템들과 라우터, 무선 액세스 포인트, PBX, 셋톱 박스, FTA 리시버, 스마트 TV, PVR, NAS 어플라이언스 등의 다양한 임베디드 장치에 보통 리눅스 배포판의 형태로 배치된다. 
  • 태블릿 컴퓨터, 스마트폰, 스마트워치를 위한 안드로이드 운영 체제는 기능 구현을 위해 리눅스 커널이 제공하는 서비스들을 사용한다. 
  • 데스크톱 컴퓨터에 채용하는 경우가 낮은 편이지만 리눅스 기반 운영 체제들은 모바일 장치에서부터 메인프레임에 이르기까지 기타 거의 모든 컴퓨팅 부문을 지배하고 있다.
  • 2017년 11월 기준으로, 세계 500대의 가장 강력한 슈퍼컴퓨터들은 모두 리눅스를 실행하고 있다.
  • 리눅스 커널은 1991년 리누스 토르발스가 자신의 개인용 컴퓨터를 위해 고안되어 개발 되었고 크로스 플랫폼의 의도는 없었으나 그 이후로 다른 운영 체제나 커널 대비 더 다양한 컴퓨터 아키텍처를 지원하도록 확장되었다.
  • 리눅스는 급속도로 기타 자유 소프트웨어 프로젝트, 특히 GNU 운영 체제로 이 커널을 채택한 개발자들과 사용자들을 매혹시켰다. 
  • 리눅스 커널은 1,200개 이상의 회사의 12,000명에 가까운 프로그래머들의 기여를 받아왔으며, 여기에는 최대 소프트웨어 및 하드웨어 벤더들 일부가 포함된다.

-x86 intel 아키텍쳐 기준, 가상 메모리 구조상 스택의 윗 영역에 존재한다.

-가상 메모리의 3~4GB 구간에 존재하는 커널 영역은 모든 태스크들의 공통 영역으로 사용된다.(1)

-가상 메모리 주소와 물리 메모리 주소를 변환하기 위해 커널 내부에는 페이징 기법이 구현되어 있다.

 

리눅스를 한마디로 표현하자면, 컴퓨터의 가장 기본적인 자원들을 관리하고 통제하기 위한, 운영체제의 핵심이 되는 소프트웨어 이다.

커널 내부는 태스크 관리자, 메모리 관리자, 파일 시스템, 네트워크 관리자, 디바이스 드라이버 관리자 등으로 구분된다.

 

(1) 태스크란?  리눅스에서 프로세스와 쓰레드를 동시에 지칭한다.

 


리눅스 커널 API

  • 사용자 프로그램들이 커널과 통신하는 API로서 매우 안정적이고 유저스페이스 프로그램(GUI를 갖추고 다른 API에 의존하는 일부 프로그램)을 망가트리지 않는다는 것을 뜻한다.
  • 커널 기능의 일부로서 장치 드라이버들은 하드웨어를 제어한다. 즉, 주류 장치 드라이버들은 매우 안정적임을 뜻한다.
  • 그러나 다른 수많은 커널과 운영 체제와 달리 커널과 적재 가능 커널 모듈(LKM) 간의 인터페이스가 매우 안정적으로 설계되었다는 것을 뜻하는 것은 아니다.
  • 전 세계 기여자들이 개발한 리눅스 커널은 자유-오픈 소스 소프트웨어의 저명한 예이며, 버전에 따라 최대 6년을 지원한다. 
  • 리눅스 커널 메일링 리스트(LKML)에서 일일 개발 토론이 진행된다.
  • 리눅스 커널은 GNU 일반 공중 사용권 버전 2 (GPLv2)로 출시되며, 일부는 자유가 아닌 여러 라이선스로 출시된 일부 펌웨어 이미지들을 포함하고 있다.

 


유저 모드/ 커널 모드란?

 

하나의 프로세스가 실수로 다른 프로세스에 입출력 작업을 하는 등의 보안적 이슐르 방지하기 위해, 유저가 컴퓨터의 자원에 함부로 접근할 수 없도록 모드를 나누어 둔 것이다.

 

유저모드 : 접근할 수 있는 영역이 제한적이며,유저 애플리케이션이 실행되는 모드. 인텔 아키텍쳐 기준 ring 3 이다.

 

커널 모드: 컴퓨터의 모든 자원에 접근할 수 있으며 커널이 실행되는 모드. 인텔 아키텍쳐 기준 ring0 이다.

 


시스템 호출이란?

 

  • 유저 공간에서 유저 애플리케이션의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
  • input/output 작업을 하기 위해선 커널에게 요청해야한다. 이러한 요청을 시스템 호출이라 한다.
  • 시스템 호출을 했을 경우 현재 모드를 커널 모드로 바꾼 뒤, 특정 작업 후 system call function을 호출한다.

 


시스템 호출 과정

int main() {



printf();


}

-------------------------------유저 모드------------------------------------- 

1. 유저 공간에서 유저가 printf() 함수를 호출한다. 

 

2. glibc의 printf()래퍼함수에서 write()를 호출한다.

 

3.write()구현부에서 트랩을 발생한다. ( int 0x80) 

 

-------------------------------커널 모드------------------------------------- 

 

4.커널에서 트랩 핸들러를 호출한다.  ( system_call() )

 

5.실제 write()함수인 sys_write()호출된다. ( sys_write() )

 

반응형

'리눅스 커널 해킹' 카테고리의 다른 글

#6 리눅스 CTF에서의 환경 셋팅  (0) 2022.08.14
#5 리눅스 qemu&gdb 셋팅  (0) 2022.08.13
#4 리눅스 커널&파일 시스템 빌드  (0) 2022.08.12
#3 리눅스 커널 3  (0) 2022.08.11
#2 리눅스 커널 2  (0) 2022.08.10
Comments