메모리 포렌식은 비록 아직까지 국내 법정에서 증거로 활용된 적은 없는 것으로 알고 있다. 그럼에도 불구하고 실무적으로나, 학문적으로나 RAM의 내용을 분석하는 것은 악성코드 또는 사람에 의한 일련의 조작행위를 역추적하고 재구성하는데 있어서 매우 중요하다는 것은 더 강조할 필요가 없다.


각 운영체제마다 RAM 메모리를 추출하는 다양한 도구들이 존재한다.

1. Windows

  • FTK Imager
  • X-ways capture
  • Winen
  • Win32dd, mdd
  • Helix PRO
  • IEEE1394(FTWAutopwn)

2. Linux / macOS

  • IEEE1394(Goldfish, pythonraw1394)
  • LiME
  • libforensic 1394

꼭 도구의 수 때문만은 아니지만, 어쨋든 경험적으로 보아도 메모리 포렌식 관련 CTF 문제는 상당부분 Windows를 기준으로 하고 있다. 따라서 윈도우쪽 자료는 풍부한 편이나, 상대적으로 리눅스 환경에 대한 분석은 찾아보기가 힘들다.


본 포스팅에서는 리눅스에서 메모리 추출을 할 수 있는 LiME 도구를 살펴본다.

이미지 설명을 입력하세요.
이미지 설명을 입력하세요.

LiME은 오픈소스 소프트웨어로, Github에서 다운로드 할 수 있다. 제작사인 504ensicsLabs의 Github 주소로 접속하면 간단한 설명을 확인할 수 있다. (링크 : https://github.com/504ensicsLabs/LiME) 기본적인 사용예제나 컴파일 방법들을 아래와 같이 소개하고 있다.

이미지 설명을 입력하세요.
이미지 설명을 입력하세요.

편리하게 사용하기 위해서는 Git을 통해 clone하도록 하겠다. 

이후 LiME 디렉토리 안에 접근해보면, LICENSE 파일과 README.md 등의 파일이 있고, src폴더가 보일 것이다. 이곳에 소스코드가 들어있다. 그런데, 문제가 있다. 본인의 컴퓨터에 테스트 해보는 경우라면 상관없지만, 궁극적으로 사이버범죄 수사에서는 메모리 포렌식을 할 때 기본적으로 용의자의 컴퓨터에서 작업을 해야 한다. 이는 즉 의심되는 시스템에서 라임을 컴파일해야 한다는 뜻이며, 대상이 어떤 운영체제에 어떤 환경을 가지고 있는지는 알 수 없다. 리눅스 운영체제라면 Ubuntu나 Fedora, RedHat 등이 가장 널리 사용되고 있겠지만, 그 외에도 상당히 많고 다양한 종류의 아키텍쳐들이 존재하며, 각 버전마다 상이한 차이점을 갖고 있기 때문에 특정 시스템으로 단정짓기 어렵다. 

가장 좋은 방법은, 해당 시스템과 정확히 일치하는 환경으로 테스트 환경을 구축해 놓고, 그곳에서 LiME을 컴파일 한 후 실행파일만 옮겨와서 대상 시스템에서 메모리를 추출하는 것이다. 하지만 만약 이 방법이 여의치 않다면 어쩔 수 없이 대상 시스템에서 직접 컴파일해야할지도 모른다. 이 경우 대상 시스템이 필연적으로 변조되기 때문에 무결성 측면에서는 상당한 손해를 볼수도 있다. 이는 증거역학적으로 잠재적인 파괴를 낳는다는 것을 명심해야 한다.


어쨌든, 이러한 주의사항을 숙지했다는 전제하에 컴파일을 계속 진행한다. 테스트를 수행한 환경은 Ubuntu 15.04이다.

잘 살펴보면 마지막에 'lime-4.2.0-42-generic.ko'라는 파일을 생성하는 것을 볼 수 있다. 여기서 4.2.0.42라는 숫자가 커널 버전을 의미하고, ko는 Kernel Object를 뜻한다. 이렇게 컴파일된 LiME 바이너리를 통해 해당 커널 버전에 대해서는 모두 사용이 가능하다. 하지만, 커널 버전이 다른 경우이거나 종류가 상이하다면 정상적으로 작동하지 않을 가능성이 더 크다.


이렇게 얻은 ko 파일을 통해 본격적으로 메모리를 추출해보자. 터미널에서 아래 명령어를 입력한다.

insmod 명령어를 통해 커널 객체를 삽입한다. 그리고 추출된 결과파일을 저장할 경로와 이름, 파일형식을 지정해준다.

이렇게 생성된 결과파일을 확인해보면 위와같이 10G의 메모리 덤프가 생성되어있다. 대상 시스템의 RAM 용량에 따라 결정된다.


디지털 포렌식에서 무결성 및 연계보관성은 매우 중요한 가치이다. 메모리 포렌식에서도 나름대로의 무결성 유지 방법이 있다. 기본적으로 한번 추출한 메모리는 이후에 다시 추출했을 때 동일할 수가 없다. 그러므로 특정 시점에 획득한 메모리를 분석할 때에는 그것이 마치 원본인 것처럼 소중하게 다루어야 한다. 즉, 파일로 저장되어있는 메모리 덤프 자체에 복사본을 생성하여 분석작업을 진행하면 된다. 이때 빠지지않고 중요한 것은 해시값을 계산하는 것이다. md5sum이나 shasum을 사용해서 해시값을 계산하자.

이 해시값은 이후에 진행될 분석작업 과정 중에서 절대로 변경되어서는 안되며, 그것이 법정에 제출될 때까지 유효하여야 한다. 이 메모리가 어느 작업자의 손을 타던, 해시값은 항상 동일해야만 한다. 그리고 그 내용은 문서화하여 서명을 하는 등의 방법으로 보증되어야 한다.


이렇게 얻은 Memory Dump 파일은 Volatility 등의 포렌식 프레임워크를 사용하여 분석할 수 있다. 관련내용은 추후에 계속 연재하도록 하겠다.

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