Memory Dump
메모리 포렌식은 실행 중인 프로세스, 애플리케이션의 상태, 사용자 활동 등의 실시간 정보 분석뿐만 아니라, 디스크 상에 물리적으로 존재하지 않거나 삭제되어 비할당영역에 존재하는 데이터도 추출할 수 있다. 추가적으로, 모바일 포렌식에서의 메모리 포렌식은 모바일 기기의 특성상 사용자가 전원을 끄는 일이 PC에 비해 훨씬 드물어 메모리 데이터 확보 확률이 훨씬 높다. 본 글은 "Frida Server"를 활용해 안드로이드의 프로세스를 논리 메모리 덤프하는 내용을 기술한 글이다.
Frida Server는 안드로이드 장치에서 실행 중인 애플리케이션의 프로세스에 접근할 수 있는 동적 분석 도구로, 이를 활용하여 프로세스의 메모리를 덤프를 수행할 수 있다. 안드로이드 기기에 Frida Server를 설치하고, 해당 Server가 메모리 덤프 데이터를 PC로 전송한다.
1. Frida Server, Frida 설치
Frida Server: PC의 Frida 클라이언트가 안드로이드 기기 애플리케이션의 메모리 데이터를 PC로 전송하기 위해 사용한다. (다운로드 링크: https://github.com/frida/frida/releases/tag/15.2.2) 15.2.2 버전의 Server를 다운로드한다.
Frida: 안드로이드 기기의 애플리케이션 메모리 데이터를 실시간으로 수집하기 위해 사용한다. (pip로 15.2.2 버전을 다운로드한다.) 이때, Frida Server와 동일한 버전을 사용해야 한다.
pip install frida==15.2.2
2. 환경 구축
다운로드한 Frida Server를 안드로이드 기기에 설치하고, "-rwxr-xr-x"권한으로 변경한다.
1. PC에서 다운로드한 "Frida Server"를 안드로이드의 "/data/local/tmp"경로에 설치한다. 이후에 안드로이드의 Shell에 접근하여, "/data/local/tmp"경로로 이동하고, "Frida Server"가 정상적으로 설치되었는지와 권한을 확인한다. 안드로이드에 "Frida Server"가 정상적으로 설치가 되었고, 권환이 "-rw-rw-rw-"임을 확인할 수 있다.
adb push "Frida Server File Path" "Android Install Path"
2."chmod"를 이용해 "Frida Server"의 권한을 775, "-rwxr-xr-x"로 변경하고, 정삭적으로 변경되었는지 확인한다.
chmod 775 "Frida Server Path"
3. Memory Dump
안드로이드의 프로세스 논리 메모리 덤프를 위해서는 안드로이드에 설치된 "Frida Server"를 실행해야 한다. 이후에 PC Frida 클라이언트에서 안드로이드 기기 메모리에 적재된 프로세스 목록을 확인하고, 덤프 하려는 프로세스를 확정하여 PC로 추출한다.
1. "Frida Server"가 설치된 경로로 이동하여, "Frida Server"를 백그라운드 실행하고 Qkwuskdhsek
./frida-server-15.2.2-android-arm64 &
2. 안드로이드 기기 메모리에 적재된 프로세스 목록을 "PID"와 "Name"으로 출력해 덤프 하려는 프로세스의 "PID"와 "Name"을 확인하여 해당 값을 이용해 메모리 덤프를 수행한다. 아래 "Chrome"의 경우 PID는 "605", Name은 "Chrome"으로 나타난다. 예시로 "Chrome"을 덤프 해보았다.
frida-ps -U
두 가지 명령어 방법으로 프로세스 메모리 덤프가 가능하다.
python fridump3.py -u -r -s "Name"
python fridump3.py -u -r "PID" -s
3. Memdump File Analysis
메모리 덤프가 완료되면, "fridump3.py"가 존재하는 경로에 "dump" 디렉터리가 생성되며, 해당 디렉터리에 메모리 덤프 파일이 저장된다. 특징으로 "dump" 디렉터리의 마지막 파일은 "string.txt" 파일로, 모든 메모리 덤프 파일의 텍스트를 모아 저장한 파일이 존재한다. 아래는 각각 "dump" 디렉터리 생성 모습, "dump" 디렉터리 내부의 메모리 덤프 파일의 모습, "string.txt"파일 내부의 모습이다.
"dump" 디렉터리의 속성을 확인하면, 추출된 메모리 덤프의 크기가 1.79GB인 점과 파일이 "2,187"개 추출되었음을 알 수 있다.
Frida를 이용한 메모리 덤프는 하나의 프로세스임에도 불구하고 매우 많은 파일로 나뉘어 추출되기 때문에 추출된 2,187개의 파일을 직접 분석하는 과정은 효율적이지 못하다. 또한 "string.txt" 파일이 저장되어 모든 메모리 덤프 파일의 string을 한 번에 확인할 있으나, 일부 Hex값의 검색, 추출, 분석에서는 적합하지 못하다. 때문에 필자는 "dump" 폴더의 모든 파일을 바이너리 단위에서 하나의 파일로 합쳐주는 코드를 작성해 하나의 "memdump"파일로 합쳐, 이후에 추가적인 메모리 덤프 파일을 분석하는 데에 유리하게 했다. 아래는 해당 코드의 내용이다.
import os
def concatenate_files_in_directory(source_directory, output_file_path):
with open(output_file_path, 'wb') as output_file:
for root, dirs, files in os.walk(source_directory):
for file in files:
file_path = os.path.join(root, file)
with open(file_path, 'rb') as input_file:
while True:
chunk = input_file.read(4096)
if not chunk:
break
output_file.write(chunk)
source_directory = r"C:\Users\korea\Desktop\Mem dump\fridump3-master\dump"
output_file_path = r"C:\Users\korea\Desktop\Mem dump\memdump"
concatenate_files_in_directory(source_directory, output_file_path)
실행결과 크기가 1.79GB인 "memdump"파일이 하나 생성되었다.
필자는 메모리 덤프 테스트를 위해 "Chrome"에서 본교를 검색("gachon university")하고 추가적으로 본교의 사이트("https://www.gachon.ac.kr/kor/index.do")에 방문하는 과정을 진행했다. 하나로 합쳐진 "memdump" 파일에서 필자가 진행한 "Chrome"의 검색기록과 방문기록을 검색하여 데이터가 존재하는지 확인해 보았다.
Reference
https://koyoungil.blogspot.com/2019/09/frida.html