악성코드 분석을 하다 보면 반복적으로 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 을 반환하는 함수입니다.
그러니 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
'Information Security > Android' 카테고리의 다른 글
Magisk v27.0+ 달라진 점 (Zygote Injection 방식) (4) | 2024.09.03 |
---|---|
Frida Build & Debug Using Logs For Android (0) | 2024.08.31 |
Proxy Android Flutter Apps (4) | 2024.05.19 |
버sucker 키우기 (0) | 2024.01.27 |
Frida-portal 사용법 (0) | 2023.12.01 |