주요 내용으로 건너뛰기

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로 메모리를 살펴보면 실행중인 파이썬 관련 정보들이 출력됨
strings로 메모리를 살펴보면 실행중인 파이썬 관련 정보들이 출력됨


한계 및 발전방향

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

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


정보보안에 관심이 많은 대학원생, 소프트웨어 엔지니어/서버관리자

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

댓글

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