Android Frida
작성자 - LRTKFirda이란?
함수를 후킹하여 해당 함수의 동작을 분석하거나 다른 동작을 수행하도록 코드를 덮는 등의 작업을 함
애플리케이션의 함수를 후킹하기 위해선 안드로이드 기기에서 Frida 서버를 열고, 후킹 코드 전달 및 후킹 결과를 확인할 수 있도록 로컬 호스트에 Frida 클라이언트를 설치해야함
클라이언트 설치 방법
$ python3 -m pip install frida-tools
서버 설치 방법
1. Frida Github에서 Frida 서버 압축파일 다운로드
2. 다운받은 Frida 서버 파일을 압축 해제한 후, AVD에 업로드
$ adb push frida-server /data/local/tmp/
3. 실행권한을 부여한 다음 frida 서버를 실행
$ adb shell
emulator_arm64:/ # cd /data/local/tmp
emulator_arm64:/data/local/tmp/ # chmod 777 ./frida-server
emulator_arm64:/data/local/tmp/ # ./frida-server
Frida 주요 기능
- Injection
커스텀 라이브러리를 앱에 로드해 사용하거나 임의 코드를 애플리케이션에 주입하여 실행하는 방식으로 사용 - Interception
특정 함수를 후킹하여 함수의 매개 변수나 반환 값을 수정할 수 있음
자체적으로 작성한 함수를 동작시키기 위해 함수를 재작성할 수도 있음
이를 통해 함수가 어떤 기능을 수행하는지, 매개 변수와 반환 값에 따라 어떤 동작이 수행되는지 알고, 함수의 동작을 임의로 변경할 수 있음 - Stalking
애플리케이션에서 명렁어 레벨의 코드를 추적할 수 있음
이를 통해 실행 중인 애플리케이션을 디버깅하고 메모리 내의 데이터를 검색하거나 추출함
자주 사용하는 명령어
Frida는 REPL(Read-Eval-Print Loop) 인터페이스를 지원함
이 때문에 쉘에서 대화형 인터페이스를 통해 좀 더 편하게 이용할 수 있음
Command
- frida : 앱을 실행하여 frida와 애플리케이션을 연결, 스크립트 로드
- frida-ps : 프로세스 목록 출력
- frida-trace : 함수 호출 추적
- frida-ls-devices : 연결된 기기 목록 출력
- frida-kill : 동작중인 프로세스 종료
이외에도 frida-discover, frida-create 등의 인터페이스가 있으나 앱 동적 분석 시에는 대부분 위의 5가지 인터페이스를 사용함
Option
- -U, --usb : USB로 연결된 기기를 연결
- -D <DEVICE ID> : 가상 기기를 연결
[Command] frida
연결된 기기에서 앱을 실행하고, 분석하고자 하는 앱을 Frida와 연결할 수 있음
frida 명령어의 자주 사용하는 옵션
- Attach
Frida에 부착(attach)할 앱을 명시함
-F 옵션으로 사용 가능하며, 현재 기기의 포그라운드 프로세스(Foreground Process)에 Frida를 연결함
-p 옵션은 앱의 프로세스 id를 통해 앱에 부착함
-n 옵션으로 앱의 패키지 이름을 통해 연결할 앱에 부착시킬 수 있음 - Spawn
-f 옵션은 앱을 실행하고, Frida와 연결함
해당 옵션의 인자로 패키지 명을 붙이면 패키지 명에 해당하는 앱을 실행할 수 있음
기기에 분석할 앱이 실행되지 않은 경우 이 옵션을 사용하여 앱을 실행하고 Frida와 연결할 수 있음
Spawn하면 프로세스를 시작하고 메인 스레드를 실행하기 전까지 일시 정지되기 때문에 메인 스레드 시작 전에 함수를 후킹 해볼 수 있음
만약 프로세스를 일시정지하고 않고 앱을 실행하고 싶다면, --no-pause 옵션을 사용할 수 있음 - Load Script
-l 옵션은 Frida 스크립트를 로드하기 위한 옵션임
스크립트 파일을 사용하면 앱과 Frida를 연결하고 Frida API를 하나하나 입력하는 형태가 아니라, Frida script 파일을 통해 Frida를 사용해서 수행할 동작을 명시해두고 앱과 Frida를 attach함과 동시에 스크립트를 실행할 수 있음
Attach vs Spawn
Attach는 이미 실행된 프로세스와 Frida를 연결하는 것
Spawn는 임의의 프로세스를 실행시킴과 동시에 Frida와 연결하는 것
[Command] frida-trace
추적할 함수와 추적에서 배제할 함수를 옵션을 통해 지정할 수 있음
- -I <MODULE> : 모듈의 모든 함수를 추적
- -X <MODULE> : 모듈의 모든 함수를 추적에서 제외
- -i <MODULE!FUNCTION> : 함수를 추적 (glob pattern)
- -x <MODULE!FUNCTION> : 함수를 추적에서 제외 (glob pattern)
- -a <FUNCTION!offset> : 함수를 추적 (offset)
Logging
-d, --decorate 옵션을 사용하면 로그에 모듈 이름을 함께 기록할 수 있음
함수를 추적할 때 여러 모듈에 같은 이름의 함수가 존재한다면, 어떤 모듈의 함수인지 알기 어려울 수 있음
-d 옵션을 사용하면 함수를 추적하면서 남기는 로그에 해당 함수를 추적하면서 남기는 로그에 해당 함수가 속한 모듈 이름을 함께 기록하여 어떤 모듈의 함수인지 확실하게 알 수 있음
Other
이 외에도 인터페이스의 이용을 더욱 쉽게 하는 옵션이 있음
$ frida-trace -U -O additional-options.txt
-O 옵션을 사용하면 사용할 옵션과 옵션에 대한 매개 변수를 파일로 입력할 수 있음 명령줄이 긴 경우,
텍스트 파일에 명령줄을 작성하여 -O 옵션 뒤에 파일을 전달하면 명령줄에 입력한 것처럼 동작함
[Command] frida-ls-devices
현재 Frida를 연결할 수 있는 기기 목록을 출력함
이를 통해 여러 기기를 연결해두고 Device ID를 기반으로 각각의 기기와 상호작용할 수 있음
[Command] frida-kill
$ frida-kill -D <DEVICE-ID> <PID>
동작중인 프로세스를 종료할 수 있음 마찬가지로 공용 옵션을 사용해서 연결할 기기를 지정하고, 그 뒤에 종료하고자 하는 프로세스의 PID를 입력하여 해당 프로세스를 종료함
프로세스의 PID는 frida-ps를 통해 확인할 수 있음
'Season 1 > 기술 보안' 카테고리의 다른 글
SQLI 보안 솔루션 및 입력 값 검증 우회 기법 (0) | 2022.03.30 |
---|---|
LFI, RFI 취약점 설명 및 실습 (0) | 2022.03.29 |
ADB Command 정리 (0) | 2022.03.21 |
[ActiveX] 2장. 취약한 ActiveX 프로그램 개발 (2) | 2022.02.28 |
[ActiveX] 1장. ActiveX란? (0) | 2022.02.28 |