이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[SSS] OS kernel and Rootkit

  • 2025.11.01 20:28
  • Computer Science/Computer Security
반응형

 

 

 

루트킷의 핵심 원리는 Control Flow Hijacking. 정상적인 흐름을 가로채서 악성 코드를 먼저 실행시키는 방식이다.

 

 

 

 

 

 

Call write를 호출하면 커널은 sys_write 함수를 찾아 0xca00000으로 이동한다.

그런데 루트킷이 먼저 커널에 침투해서 func sys_rootkit() 함수를 0xcafecafe 주소에 올려버린다면? 

추가로, 시스템 콜 테이블의 sys_write 항목이 가리키는 주소를 oxcafecafe로 바꿔버리면? 

 

정상적인 sys_write() 함수 대신 sys_rootkit() 함수를 실행하게 된다.

 

 

루트킷이 커널에 침투하려면 애초에 User Level 프로그램에서 취약점을 통해 권한을 획득해야 한다.

그러니 지금까지 배운 취약점을 사용해 권한을 얻은 후에 루트킷을 적용하는게 순서임.

 

Stack - Data Execution Prevention, Stack Cookie 등으로 방어 가능 

Heap - 힙 오버플로우, Use After Free 등으로 공격 가능 

 

운영체제에서 배운것처럼 PCB는 프로세스에 대한 모든 정보를 가지고 있다.

PCB는 공격 맛집이다. 특히 uid값을 잘 조작하면 권한을 아주 쉽게 획득할 수 있다. 

 

루트킷은 페이징 구조 자체를 공격한다. 

 

 

 

코드 영역 권한이 r-xp로 설정되어 있다. x 비트가 켜져있다는건 실행이 가능하다는 것.. 

데이터, 힙, 스택 영역은 r--p나 rw-p로 설정되어있다. x비트가 없으니 실행이 안된다.

 

DEP가 적용되었다는 것. 

루트킷이 커널 권한을 얻는다면 스택 영역의 PTE를 찾아서 x비트를 켜버릴 수 있다. 

 

각 프로세스는 서로 다른 페이지 테이블을 가지니 서로의 물리 메모리 주소를 다룰 수 없다.

또한, User Level 프로세스는 커널 메모리에 접근할 수 없다. (하드웨어 수준에서 금지) 

 

정리하면... 루트킷이 설치되기 전 단계에서 Canary NX ASLR 등으로 1차 방화벽을 구축한다.

여기서 뚫리면 루트킷이 시스템에 설치되는거고, 시스템이 해킹당하는 것..

 

 

 


 

 

 

 

루트킷은 OS 커널 권한을 가진 악성 코드로, OS의 기능을 조작해서 공격 탐지를 방해한다.

커널 권한을 획득하기에, 루트 권한으로 실행되는 보안 프로그램도 무력화 할 수 있다.

 

 

 

 

디바이스 드라이버 형태로 동작하는 경우가 많다.

이미지는 재배치 가능한 오브젝트 파일 (*.o) 의 형태를 보여준다.

커널 모듈 파일인 .ko 확장자도 .o 형태와 유사하다. 루트킷 파일도 .ko 확장자를 사용한다. 

 

.ko 파일을 커널에 설치할 때는 insmod 명령어를 사용한다.

insmod 명령어는 init_module 라는 특수 시스템 콜을 호출하고, insmod 프로세스의 메모리에 있던 루트킷 코드를 커널 메모리 공간으로 복사하고 커널 모듈로 등록한다.

 

근데 당연한거지만 1차 방화벽을 뚫고 루트 쉘을 획득해야지 insmod rookit.ko 를 실행할 수 있음 ..

 

 

 

 

 

루트킷이 설치되기 전에 unlink() 시스템 콜은 파일을 삭제시키는 작업을 수행한다. (rm 명령어와 동일)

 

 

 

 

 

 

insmod /root/rookit.ko 명령어로 루트킷을 설치하고 난 후에는 작업 자체가 달라진다.

루트킷은 시스템 콜 테이블의 unlink 항목을 수정했고, unlink 호출은 sys_unlink() 로 바로 가지 않고 루트킷이 심어놓은 hack_unlink() 함수를 먼저 간다 - Hooking

 

hook_unlink() 함수가 먼저 실행되고, 사용자가 지우려는 파일 이름을 검사한다. 

예시는 루트킷을 사용해 특정 파일에 대한 삭제 요청만 선택적으로 무시하는 과정을 보여준다. 

 

 

 

 

 

 

시스템 콜 테이블의 항목을 수정하지 않고도 Hooking을 수행할 수 있다. 

 

Virtual File System은 다양한 종류의 파일 시스템을 동일한 방식으로 접근할 수 있게 해 주는 추상화 계층이다.

사용자가 cat /proc/net/tcp 명령어를 실행하면 read() 시스템 콜이 호출되고, 시스템 콜 테이블을 통해 sys_read 함수로 연결된다.

 

sys_read 함수는 목적지 파일의 메타정보가 담긴 구조체인 I-NODE를 찾아가고, I-NODE 구조체 안에는 실제 파일 읽기 작업을 처리하는 vfs_read 함수의 주소를 가지고 있다. 

 

VFS Hooking Rootkit이 설치됐다. 이러면 루트킷이 I-NODE 구조체 내의 vfs_read 함수 포인터를 악성 함수인 hack_read 주소로 바꿔버린다.

sys_read는 I-NODE를 보고 vfs_read인줄 알고 호출하지만, 실제로는 hack_read가 실행된다.

 

hack_read는 vfs_read로부터 받은 원본 데이터를 검사하는데.. 여기서 숨기고 싶은 내용이 있다면 그 내용을 삭제해버린다.

 

 

 

루트킷을 응용해보자.

시스템에 루트킷을 설치하고, 로컬 DNS 캐시를 조작할 수 있다.

naver.com 에 로그인 할 때, 실제로는 피싱 사이트로 이동시키고.. 로그인 시 아이디와 비밀번호를 공격자의 DB로 전송할 수 있다.

루트킷은 커널 내부에서 직접 패킷을 변조하기에 기존의 방어 로직을 모두 우회할 수 있고, 탐지하기도 매우 어렵다. 

 

루트킷이 커널을 공격하려면 커널이 동작하는 CPU의 하드웨어 구조를 알아야 한다.

PC는 x86을 쓰고.. 안드로이드는 ARM을 쓰고.. 공격 대상의 하드웨어 정보를 이해해야 한다.

 

 

 

 

반응형
저작자표시 (새창열림)

'Computer Science > Computer Security' 카테고리의 다른 글

[SSS] Trusted Execution Environment  (0) 2025.11.14
[SSS] Software Defense  (0) 2025.11.10
[SSS] Race Condition  (0) 2025.10.20
[SSS] Return Oriented Programming  (0) 2025.10.09
[SSS] Format String Bug  (0) 2025.10.06

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [SSS] Trusted Execution Environment

    [SSS] Trusted Execution Environment

    2025.11.14
  • [SSS] Software Defense

    [SSS] Software Defense

    2025.11.10
  • [SSS] Race Condition

    [SSS] Race Condition

    2025.10.20
  • [SSS] Return Oriented Programming

    [SSS] Return Oriented Programming

    2025.10.09
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (679) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (10)
    • 💬 기록 (8) N
    • 📚 공부 (6)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바