주요 내용으로 건너뛰기

ProcDump - 리눅스 프로세스 메모리 덤프 도구 by Microsoft

그동안 리눅스 환경에서의 메모리 분석을 주로 다루면서, 특정 프로세스의 메모리를 추출하는 방법은 크게 두가지였다.

  1. 전체 메모리 덤프를 획득한 후, volatility 의 플러그인(linux_memmap, linux_proc_maps, linux_dump_map 등)을 활용하여 특정 프로세스의 pid 만 선별하여 추출하는 방법
  2. 활성 시스템에서 gdb를 이용하여 특정 프로세스에 attach 한 후 (gdb) dump memory 하는 방법.

이 두가지 방법으로도 나름 잘 작동하긴 하지만, 윈도우즈의 Sysinternals 와 같은 쉽고 편리한 방법이 있었으면 했는데 정말로 그 일이 일어났다!

마이크로소프트가 그동안의 행보와는 다르게 오픈소스에 많은 관심을 갖기 시작하면서 리눅스를 품기도 하고, 급기야 Github까지 인수해버렸다. 물론 아직 그들을 신뢰하지 않는 개발자들도 많지만, 어쨌거나 Sysinternals 같은 도구를 리눅스에서도 구현하려고 하는 것 같다.


그 첫번째 사례로 리눅스 시스템에서 구동중인 프로세스의 메모리를 덤프할 수 있는 ProcDump 도구를 공개하였다.

공식 Github 의 설명을 참고하여, 직접 설치해보고 구동해본 결과를 아래에 짧게 정리해둔다.


최소 요구사항

운영체제 : 

  • Red Hat Enterprise Linux / CentOS 7
  • Fedora 26
  • Mageia 6
  • Ubuntu 14.04 LTS
gdb >= 7.6.1
zlib (build-time only)


설치방법

Ubuntu 16.04를 기준으로 설치하는 방법을 안내한다. 더욱 자세한 설명은 MS의 Github를 참고할 것.

1) Package Manager 이용하는 방법

우선 마이크로소프트를 신뢰할 수 있는 gpg 목록에 추가한다.

그리고 아래의 명령어로 Microsoft 의 목록을 갱신한다.

이제 apt-get install 명령어를 통해 procdump를 설치할 수 있을 것이다.


2) 수동 설치 방법

굳이 Microsoft의 모든 목록을 등록하지 않고 필요한 procdump만 빠르게 설치하고 싶은 경우, MS에서 제공하는 *.deb 파일만 다운로드하여 직접 설치할 수 있다.

우분투 16.04 전용 파이너리는 아래 방법으로 다운로드할 수 있다.

다운로드한 파일을 설치하기 위해서는 아래의 dpkg 명령어를 이용한다.

설치가 완료되면 --help 명령어로 확인해보자.


사용예

공식 홈페이지에서 설명하고 있는 방법은 아래와 같다.

간략히 요약하면 먼저 반드시 필요한 매개변수는 -p (프로세스 pid) 또는 -w (프로세스의 이름)이 반드시 지정되어야 한다. 그리고 아래의 추가적인 옵션 설정을 따른다.

 -C는 프로세스의 덤프를 생성할 때 CPU의 사용률을 지정할 때 사용하며, -c 의 경우에는 최저치를 설정한다. -M은 메모리의 최대 임계값, -m은 최저 임계값이며 이보다 낮아질 경우 원활히 작동하지 않게 된다. -n은 덤프할 횟수를 나타내며, -s는 덤프할 주기를 설정한다. 기본적으로는 10초에 한번으로 되어 있다.


이를 예제로 설명하면 아래와 같다. 

우선 프로세스 메모리 덤프에는 루트 권한이 필요하다. 그리고 -p 옵션으로 1234번 pid를 가지는 프로세스를 지정하였다. (참고로 pid는 ps -ef 명령어로 찾을 수 있다.)

아래는 5초에 한번씩 3번 덤프를 수행한다.

아래는 CPU 사용량이 65% 이상이거나 메모리 사용량이 100 MB 이상일 때 코어 덤프를 떨어뜨린다.


아래는 파이썬으로 구동되고 있는 pid 26101 프로세스에 대해 덤프한 결과 화면이다. 덤프 결과물을 확인해보면 ELF-64bit core file로 덤프되어 있는 것을 확인할 수 있다.

이제 주어진 덤프를 통해 프로세스의 행위를 분석할 수 있다. 여기에는 추가적인 다른 도구나 방법들이 필요할 것이나, 여기에서 설명하기엔 범위를 벗어난다. 우선 가장 기본적으로는 strings 명령어만 쳐봐도 메모리 속에서 사람이 읽을만한 정보는 어느정도 추출할 수 있다.

strings로 메모리를 살펴보면 실행중인 파이썬 관련 정보들이 출력됨


한계 및 발전방향

현재로써는 Linux Kernel 버전이 3.5 이상인 경우에서만 작동된다. 

아직까지는 Windows 버전 sysinternals 도구에 비해 기능이 완전히 지원되지는 않으며 향후 업데이트를 기대해본다.


Software Security Engineer

CPUU 님의 창작활동을 응원하고 싶으세요?

댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.