본문 바로가기

Android/Tech

SO 인젝션 동작 순서

SO 인젝션 동작 순서

1. 인젝션할 SO파일을 /data/local/tmp 또는 샌드박싱 영역(/data/data/패키지명)에 옮긴다. 낮은 버전의 안드로이드면 로드가 되겠지만 같은 uid, context(selinux) 권한 맞춰줘야 된다.

2. /proc/%d/cmdline 폴더를 순회하면서 zygote 프로세스명을 찾고 해당 프로세스의 pid값을 알아낸다.

3. zygote 함수를 사용하여 해당 프로세스에 ptrace로 어태치한다.

4. libc.so의 mmap 함수의 위치를 알아낸다.

5. read/write 권한을 인자로 주어 mmap 함수를 호출한다.

6. libc.so의 mprotect 함수의 위치도 알아낸다.

7. mmap으로 만든 메모리 영역에 READ/EXEC 권한으로 변경해준다.

8. mmap함수 호출 후 반환된 주소값에 인젝션할 so파일의 경로를 write 해준다.

9. /system/bin/linker에서 dlopen 함수의 위치를 알아낸다.

10. dlopen(mmap반환값, RTLD_NOW, RTLD_GLOBAL) 함수로 호출하여 라이브러리를 로드한다.

11. 필요하다면 dlsym 함수도 마찬가지로 호출하면 된다.

 

린엔진, frida도 이와 유사한 방식이라고 보면 된다.