IDA를 이용한 Android App Library 동적 디버깅
정적 분석에서 자주 사용했던 IDA로 App의 Native와 JVM단에서의 동적 디버깅을 할 수 있다.
JVM디버깅은 JEB가 Bytecode를 Hexray해줘서 보기 더 편하긴 하지만, JEB가 없다면 유용하게 사용할 수 있다.
일단 프로세스의 메모리를 읽고 쓸수 있어야 하기 때문에 root권한이 필요하다.
그리고 App이 Android Manifest.xml 파일을 수정해줘야 하므로 리패키징 과정이 필요하다.
Android Manifest.xml 수정
모든 어플들은 android:debuggable 옵션이 False로 설정되어서 릴리즈된다.
만약 해당 옵션이 설정되어 있지 않으면 기본으로 False로 설정된다.
debuggable옵션이 활성화되어 있으면 플레이 스토어와 같은 마켓에 App을 업로드할 수 없기 때문이다.
따라서, 위 그림처럼 android:debuggable="true"를 추가하고 App을 다시 리패키징해줘야 한다.
App 리패키징과정은 apktools과 apksigner로 진행할 수 있으며 과정설명은 생략하도록 하겠다.
Dirty Cow(CVE-2016-5195) 취약점을 이용하면 ro.debuggble 값을 true로 수정하여 기기 자체의 Debug옵션을 활성화할 수 있다.App마다 일일히 수정하는 과정이 귀찮다면, Drity Cow Exploit 가능한 테스트 기기를 구해서 사용하면 된다.
IDA Debug Server 설정
IDA와 디바이스는 서로 TCP통신으로 정보를 주고 받기 때문에 디바이스에 IDA Server를 올려줘야 한다.
IDA Server는 IDA/dbgsrv폴더에 존재하며, 나의 경우 C:\Program Files\IDA 7.0\dbgsrv에 위치하고 있다.
각 아키텍처 별로 서버파일이 있는데, 에뮬레이터의 경우 linux_server / 실제 기기는 android_server를 사용하면 된다.
아키텍처 확인은 adb shell getprop ro.product.cpu.abi로 확인할 수 있다.
나의 경우 arm64-v8a로 android_server64를 사용하면 된다.
adb push android_server64 /data/local/tmp 명령어로 IDA Server파일을 옮겨준다.
android_server64에 실행권한을 부여하고 root권한으로 서버를 백그라운드로 실행해준다.
서버가 정상적으로 실행되면 TCP:23946 Listening 상태로 IDA Attach를 기다리게 된다.
이제 로컬에서의 TCP:23946 연결이 디바이스로 포워딩 될 수 있도록 포트포워딩을 해주면 된다.
adb forward tcp:23946 tcp:23946을 입력하면 포트포워딩 설정이 완료된다.
IDA Attach
이제 로컬에서 IDA를 실행해서 타겟 프로세스에 Attach 해주면 된다.
adb shell am start -D -n Package/MainActivity로 App을 Debugmode로 실행시켜준다.
물론 App의 android:debuggable 옵션이 true로 설정되어 있어야 한다.
Debugmode로 App을 실행시키면 위 그림처럼 Debugger Attach 대기 상태가 된다.
이 상태에서 IDA로 붙어주면 대기 상태가 해제되고 MainActivity가 시작된다.
서버가 android_server면 ARMLinux/Android debugger, Linux_server면 Linux debugger를 선택하면 된다.
Debugger를 선택하면 Host IP와 Port를 입력해주면 된다.
IP는 127.0.0.1을 입력하면 되고, Port는 특별한 상황 아니면 Default Port 23946 그대로 냅두면 된다.
Debugger 연결이 완료되면 대상 디바이스의 프로세스 목록들을 볼 수 있다.
이 중 타겟 프로세스를 찾아서 Attach를 해주면 된다.
Attach가 완료되면 ctrl+s로 Segment Table을 확인하고 분석하고자 하는 라이브러리에 Break Point를 설정해주면 된다.
그리고 F9로 프로세스를 시작해줘서 분석을 시작하면 된다.