Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/velocidex/linpmem
Memory ForensicsForensicsDigital ForensicsIncident Response
GitHubvelocidex/linpmem

Linpmem

리눅스 커널 드라이버로서 물리 메모리 획득을 수행하며, 예약된 메모리 및 메모리 홀을 포함한 모든 물리 주소에 대한 읽기 접근을 가능하게 하고, CR3 정보와 가상-물리 주소 변환 서비스를 제공합니다.

저장소 보기
1051221년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Linpmem -- Linux용 물리 메모리 획득 도구

alt text

Linpmem은 Linux x64 전용 물리 메모리 읽기 도구입니다.

Windows용 대응 도구인 Winpmem과 마찬가지로, 이는 전통적인 메모리 덤퍼가 아닙니다. Linpmem은 모든 물리 주소(예약 메모리* 및 메모리 홀 포함)에서 읽을 수 있는 API를 제공하며, 일반적인 메모리 덤핑에도 사용할 수 있습니다. 또한 드라이버는 바이트, 워드, dword, qword 및 버퍼 액세스 모드와 같은 다양한 액세스 모드를 제공하며, 대부분의 표준적인 경우에는 버퍼 액세스 모드가 적합합니다. 정렬된 바이트/워드/dword/qword 읽기가 필요한 경우 Linpmem은 정확히 그렇게 수행합니다.

현재 Linpmem의 기능은 다음과 같습니다.

  1. 물리 주소에서 읽기 (액세스 모드: byte, word, dword, qword, buffer)
  2. CR3 정보 서비스 (pid로 대상 프로세스 지정)
  3. 가상 주소를 물리 주소로 변환 서비스

향후 전문 읽기 액세스 모드를 지원하기 위해 캐시 제어가 추가될 예정입니다.

요약 테이블

  • 커널 드라이버 빌드하기
  • 드라이버 로드하기
  • 사용법
    • 데모 코드
    • CLI 도구
    • 라이브러리
    • 메모리 덤핑 도구
  • 라이브러리
  • 테스트된 Linux 배포판
  • Secure Boot 처리
  • 알려진 문제
  • 작업 중
  • 향후 작업
  • 감사의 말

커널 드라이버 빌드하기

적어도 지금은 Linpmem 드라이버를 직접 컴파일해야 합니다. 다른 Linux 시스템에서 미리 컴파일된 Linpmem 드라이버를 로드하는 방법은 현재 작업 중이지만 아직 완료되지 않았습니다. 하지만 Linpmem 드라이버를 컴파일하는 것은 어렵지 않으며, 기본적으로 'make'를 실행하면 됩니다.

1단계 - 올바른 헤더 가져오기

make와 C 컴파일러가 필요합니다. (gcc를 권장하지만 clang도 작동해야 합니다.)

linux-headers가 설치되어 있는지 확인하세요 (대상 Linux 배포판의 패키지 관리자를 사용하여). 정확한 패키지 이름은 배포판에 따라 다를 수 있습니다. 패키지가 설치되어 있는지 빠르게 확인하는 방법(배포판에 독립적):

root@kitploit:~
ls -l /usr/lib/modules/`uname -r`/

이상입니다. 2단계로 진행할 수 있습니다.

외부 시스템: 현재 다른 시스템용으로 드라이버를 컴파일하려는 경우(예: 대상 시스템에서 컴파일할 수 없지만 메모리 덤프를 생성하려는 경우) 해당 시스템의 Linux 배포판 패키지 저장소에서 직접 헤더 패키지를 다운로드해야 합니다. 패키지 버전이 외부 시스템에서 실행 중인 릴리스 및 커널 버전과 정확히 일치하는지 다시 확인하십시오. 다른 시스템이 자체 컴파일된 커널을 사용하는 경우 해당 커널의 빌드 디렉터리 사본을 가져와야 합니다. 그런 다음 두 디렉터리 중 하나의 위치를 KDIR 환경 변수에 설정합니다.

root@kitploit:~
export KDIR=path/to/extracted/header/package/or/kernel/root

2단계 - make

드라이버 컴파일은 간단합니다. 다음을 입력하기만 하면 됩니다:

root@kitploit:~
make

그러면 현재 작업 디렉터리에 linpmem.ko가 생성됩니다.

컴파일하기 전에 precompiler.h를 확인하고 릴리스 또는 디버그용으로 컴파일할지 선택할 수 있습니다(예: 디버그 출력 포함). 현재 다른 컴파일러 설정은 많지 않습니다.

드라이버 로드하기

linpmem.ko 모듈은 insmod linpmem.ko의-경로를 사용하여 로드하고 rmmod linpmem.ko의-경로를 사용하여 언로드할 수 있습니다. (이렇게 하면 현재 부팅 시간 동안만 드라이버가 로드됩니다.) 디버그용으로 컴파일한 경우 dmesg도 확인하십시오.

로드 후 드라이버와 통신하려면 장치를 생성해야 합니다:

root@kitploit:~
mknod /dev/linpmem c 42 0

드라이버와 통신할 수 없는 경우 dmesg 로그를 확인하여 '42'가 실제로 등록된 major 번호인지 확인하십시오:

root@kitploit:~
[12827.900168] linpmem: registered chrdev with major 42

일반적으로 커널은 이 번호를 실제로 할당하려고 시도합니다.

루트 콘솔을 항상 열어 두지 않으려면 chown을 사용하여 장치를 사용자에게 부여할 수 있습니다. (또는 계속 루트 콘솔에서 사용해도 됩니다.)

  • dmesg 출력을 확인하십시오. 오류가 보이면 보고해 주세요!
  • 경고: Linpmem에서 재부팅하라는 dmesg 오류 메시지가 표시되면 즉시 재부팅하는 것이 좋습니다.
  • 경고: 이것은 초기 버전입니다.

사용법

데모 코드

드라이버와 상호 작용하는 방법을 자세히 설명하는 예제 코드가 있습니다. 사용자 공간 API 참조는 ./userspace_interface/linpmem_shared.h에서 찾을 수 있습니다.

  1. cd demo
  2. gcc -o test test.c
  3. (sudo) ./test // <= 장치에 chown을 사용하지 않은 경우 sudo가 필요합니다.

이 코드는 라이브러리를 사용하는 대신 드라이버와 직접 상호 작용하는 방법을 이해하려는 경우 중요합니다. 또한 간단한 기능 테스트로 사용할 수 있습니다.

명령줄 인터페이스 도구

Linpmem용 (선택 사항) 기본 명령줄 인터페이스 도구인 pmem CLI 도구가 있습니다. 여기에서 찾을 수 있습니다: https://github.com/vobst/linpmem-cli. 소스 코드 외에도 미리 컴파일된 CLI 도구와 정적 라이브러리 및 헤더가 여기에서 (서명된 상태로) 제공됩니다. 참고: 이것은 예비 버전이며, 곧 많은 추가 사항과 개선 사항이 따를 예정이므로 업데이트를 확인하십시오.

pmem CLI 도구는 Linpmem의 다양한 기능을 (비교적) 안전하고 편리한 방법으로 테스트하는 데 사용할 수 있습니다. 이 도구를 사용하면 insmod/rmmod 대신 Linpmem을 로드할 수도 있으며, 향후 추가 옵션이 제공될 예정입니다. 또한 pmem이 즉시 사용할 수 있는 올바른 장치를 자동으로 생성한다는 장점이 있습니다. 매우 이식성이 뛰어나며 모든 Linux 시스템에서 실행되며(실제로 Linux 2.6에서도 테스트되었습니다) 있습니다.

root@kitploit:~
$ ./pmem -h
linpmem 드라이버용 명령줄 클라이언트

사용법: pmem [옵션] [명령]

명령:
  insmod  linpmem 드라이버 로드
  help    이 메시지 또는 지정된 하위 명령의 도움말 출력

옵션:
  -a, --address <주소>            물리 읽기 작업의 주소
  -v, --virt-address <가상_주소>  대상 프로세스 주소 공간에서 주소 변환 (기본값: 현재 프로세스)
  -s, --size <크기>               버퍼 읽기 작업의 크기
  -m, --mode <모드>               읽기 작업의 액세스 모드 [가능한 값: byte, word, dword, qword, buffer]
  -p, --pid <PID>                 cr3 정보 및 가상-물리 변환의 대상 프로세스
      --cr3                        대상 프로세스의 cr3 값 조회 (기본값: 현재 프로세스)
      --verbose                    디버그 출력 표시
  -h, --help                      도움말 출력 ('--help'로 더 많은 정보 보기)
  -V, --version                   버전 출력

CLI 도구를 직접 컴파일하려면 해당 디렉터리로 이동하여 (CLI) Readme의 지침에 따라 빌드하십시오. 그렇지 않으면 사전 빌드된 프로그램을 다운로드하면 모든 Linux에서 작동합니다. CLI 도구로 커널 드라이버를 로드하려면:

root@kitploit:~
# pmem insmod path/to/linpmem.ko

pmem 도구를 사용하여 드라이버를 로드하면 장치 파일을 직접 만들 필요가 없으며 (다음 릴리스에서는) linpmem 장치의 소유자를 선택할 수 있습니다.

라이브러리

pmem 명령줄 인터페이스는 드라이버와 인터페이스하는 API를 노출하는 작은 Rust 라이브러리의 얇은 래퍼일 뿐입니다. 고급 사용자는 이 라이브러리를 사용할 수도 있습니다. 라이브러리는 https://github.com/vobst/linpmem-cli에서 컴파일할 때 pmem CLI 도구와 함께 자동으로 컴파일되지만 (사전 컴파일된 상태로) 여기에도 (서명된 상태로) 포함되어 있습니다. 참고: 이것은 예비 버전이며, 곧 더 많은 기능이 추가될 예정입니다.

사용자 모드 라이브러리를 사용하지 않고 직접 드라이버와 인터페이스하려면 ./userspace_interface/linpmem_shared.h에서 사용자 공간 API/인터페이스 및 문서를 찾을 수 있습니다. 또한 demo/test.c에서 드라이버를 직접 사용하는 방법을 설명하는 예제 코드를 제공합니다.

Python 래퍼

LinPyMem: linpmem 드라이버용 Python 래퍼. PyPI에서 사용 가능.

메모리 덤핑 도구

아직 구현되지 않았습니다.

테스트된 Linux 배포판

  • Debian, 자체 컴파일 6.4.X, Qemu/KVM, 반가상화되지 않음.
    • PTI: off/on
  • Debian 12, Qemu/KVM, 완전 반가상화.
    • PTI: on
  • Ubuntu server, Qemu/KVM, 반가상화되지 않음.
    • PTI: on
  • Fedora 38, Qemu/KVM, 완전 반가상화.
    • PTI: on
  • 베어메탈 Linux 테스트, AMI BIOS: Linux 6.4.4
    • PTI: on
  • 베어메탈 Linux 테스트, HP: Linux 6.4.4
    • PTI: on
  • 베어메탈, Arch[-hardened], Dell BIOS, Linux 6.4.X
  • 베어메탈, Debian, 6.1.X
  • 베어메탈, Ubuntu 20.04, Secure Boot 켜짐. 작동하지만 드라이버를 먼저 서명하십시오.
  • 베어메탈, Ubuntu 22.04, Linux 6.2.X

Secure Boot 처리

모듈을 로드할 때 시스템이 다음과 같은 오류 메시지를 보고하면 Secure Boot 때문일 수 있습니다:

root@kitploit:~
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted

모듈을 로드하는 방법은 여러 가지가 있습니다. 가장 확실한 방법은 UEFI 설정에서 Secure Boot를 비활성화하는 것입니다.

배포판에서 지원하는 경우 모듈을 사용하기 전에 서명하는 것이 더 우아한 해결책입니다. 다음 단계를 따라 수행할 수 있습니다 (Ubuntu 20.04에서 테스트됨).

  1. mokutil 설치:
    root@kitploit:~
    $ sudo apt install mokutil
    
  2. 서명 키 자료 생성:
    root@kitploit:~
    $ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Some descriptive name/"
    
    필요에 따라 옵션을 조정하십시오. 특히 키 길이 (-newkey), 유효 기간 (-days), 키 암호 설정 옵션 (-nodes; 암호를 설정하려면 생략), 인증서에 포함할 공통 이름 (-subj)을 고려하십시오.
  3. 새 MOK 등록:
    root@kitploit:~
    $ sudo mokutil --import mok-signing.crt
    
    다음 단계에서 필요한 암호를 묻습니다. US 키보드 레이아웃에서 입력할 수 있는 암호를 사용하는 것이 좋습니다.
  4. 시스템 재부팅. MOK 등록 메뉴가 나타납니다. 지침에 따라 새 키를 등록합니다.
  5. 모듈 서명 MOK가 등록되면 모듈에 서명할 수 있습니다.
    root@kitploit:~
    $ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 path/to/mok-singing/MOK.key path/to//MOK.cert path/to/linpmem.ko
    

그러면 모듈을 로드할 수 있습니다.

포렌식 준비 관점에서 볼 때, 위 과정에서 시스템이 두 번 재부팅되어 메모리의 휘발성 데이터 대부분이 파괴되므로 필요한 이전에 서명된 모듈을 준비해야 합니다.

알려진 문제

  • 거대 페이지 읽기가 구현되지 않았습니다. Linpmem은 거대 페이지를 인식하고 현재로서는 읽기를 거부합니다.
  • 매핑된 I/O 및 DMA 공간에서 읽기는 CPU 캐싱을 활성화한 상태로 수행됩니다.
  • 페이지 테이블 워크 중 잠금이 수행되지 않습니다. 이로 인해 동시 수정이 진행 중일 때 재미있는 결과가 발생할 수 있습니다. 이는 전체 OS를 완전히 중단하지 않고 라이브 RAM을 읽을 때의 일반적이고 (대부분 해결할 수 없는) 문제입니다.
  • Secure Boot (Ubuntu): 사용 전에 드라이버를 서명하십시오.
  • CPU 기반 메모리 암호화(예: AMD SME, Intel SGX/TDX, ...)
  • Pluton 칩?

(문제가 발생하면 잠재적인 문제를 보고해 주십시오.)

작업 중

  • 미리 컴파일된 드라이버를 모든 Linux에서 로드하는 방법.
  • 프로세서 캐시 제어. 예: 매핑된 I/O 및 DMA 공간의 캐싱되지 않은 읽기.

향후 작업

  • Arm/Mips 지원. (먼 미래의 작업)
  • 레거시 커널(예: 2.6), 유닉스 기반 커널

감사의 말

Linpmem과 Winpmem은 (현재 종료된) REKALL 프로젝트의 선배들의 작업이 없었다면 존재하지 않았을 것입니다: https://github.com/google/rekall.

  • PTE 리매핑에 대한 선구적인 작업과 오픈 소스 기여에 대해 Mike Cohen과 Johannes Stüttgen에게 감사드립니다. 이 기술은 10년이 지난 지금도 여전히 사용되고 있습니다.

오픈 소스 기여자:

  • Viviane Zwanger
  • Valentin Obst
도구 다운로드