Information Security/Android

Android SO File Dump

hackcatml 2024. 8. 31. 23:11
반응형

악성코드 분석을 하다 보면 반복적으로 so 파일을 추출하고 있는 자신을 발견하게 됩니다.

apk를 까봤더니 그 안에 타겟 so 파일이 들어 있고 IDA에서 문제없이 열린다면 매우 땡큐입니다. 분석 난이도가 매우 낮은 경우로 흔하지 않습니다.

그렇지 않은 경우에도, frida 가 순조롭게 붙기만 하면 쉽게 타겟 so 파일을 획득할 수 있습니다.

그런데 조금 난이도가 있는 친구들은 frida 탐지 기능은 내비둔채, 앱의 솔루션을 무력화합니다.

이 경우 frida 탐지 기능을 우회하면 되지만, 여의치 않은 경우 native 모듈을 만들어 so 파일을 추출하게 됩니다.

 

아래 그림의 so 로딩 흐름을 보면, 최종적으로 linker 의 do_dlopen 을 호출하는 것을 알 수 있습니다.

출처: https://juejin.cn/post/6899061455610773511 

 

 

do_dlopen 함수는 첫번째 인자로 so 파일 이름이 전달되고, so 파일이 로드되었다면 그 so 파일의 handle 을 반환하는 함수입니다.

출처: https://cs.android.com/android/platform/superproject/+/android14-qpr3-release:bionic/linker/linker.cpp;l=2112;bpv=1?q=do_dlopen&ss=android%2Fplatform%2Fsuperproject

 

 

그러니 do_dlopen 함수를 후킹하면 so 파일 로딩을 추적 및 덤프를 뜰 수 있습니다.

do_dlopen 함수의 심볼은 "__dl__Z9do_dlopenPKciPK17android_dlextinfoPKv" 입니다.

 

 

so 파일 로딩을 온전히 추적하기 위해서 후킹 타이밍은 빠르면 빠를 수록 좋겠죠.

모든 프로세스의 부모인 zygote 에 injection 하여 구현하는게 제일 좋습니다.  zygote 가 fork 되면서 앱 프로세스가 시작이 되는데, 이 zygote 에 모듈을 인젝션 해놓으면, 앱의 시작과 동시에 모듈을 작동하게 할 수 있기 때문입니다.

magisk 의 기능인 zygisk 가 zygote injection 을 구현해놓았으며, 우리가 할 것은 zygisk 모듈을 만들기만 하면 됩니다.

 

음 zygisk 모듈을 만드는 것은 알겠고, 덤프 로직은 어떻게 구현해야 할까요?

so 파일의 base 주소와 size 정보를 알아내서 메모리에서 그만큼을 읽어들여 파일에 쓰면 되겠네요.

frida-gum (https://github.com/frida/frida-gum) 에서 제공하는 여러 유용한 api 들을 이용하면 수월하게 구현 가능합니다.

 

이를 종합해서,  여러 so 파일 로딩 case에 대응하여 덤프를 뜰 수 있는 툴을 제작하였습니다. 사용법은 깃헙 참고 바랍니다.

https://github.com/hackcatml/zygisk-memdump

 

GitHub - hackcatml/zygisk-memdump: A zygisk module that dumps so file from process memory

A zygisk module that dumps so file from process memory - hackcatml/zygisk-memdump

github.com

 

 

 

반응형