1. Frida gadget
1.1 Frida 도구 설명
Frida
frida-server
를 장치 안에서 실행시켜 pc의 frida-client
와 애플리케이션과 통신하는 방식 (루팅 된 환경에서 주로 사용함)Frida-gadget
애플리케이션에 frida-lib를 추가하여 앱 실행 시 frida-server가 구동하는 방식입니다. (비 루팅 환경에서도 쓸 수 있지만 애플리케이션에 매번 의존성을 추가해 주어야 하기 때문에 비 추천합니다.)
➡️본 글은
루팅된
기기에서 진행할 예정임으로 Frida로 진행합니다.1.2 Frida 주요 도구
frida
Frida CLI환경으로, 디버깅 환경에서 주로 사용합니다.
frida-ps
Frida에 연결된 프로세스 목록을 출력하기 위해 사용합니다.
frida-trace
프로세스의 함수 호출을 동적으로 추적하기 위해 사용합니다.
옵션
# help -h, --help # USB 장치에 연결 -U, --usb # 애플리케이션 리스트만 출력 (안붙이면 모든 프로세스 출력) -a # javascipt를 이용한 후킹 시, script를 로드 -l <script_file>, --load=<script_file> # 주어진 ID로 장치에 연결 -D ID, --device=ID # 원격으로 프리다 서버가 설치된 곳에 attach -R, --remote
추가적으로
frida -h
를 입력하게 되면, 옵션이 전부 출력되기 때문에 더 자세한 옵션을 알고 싶을 때 사용하면 됩니다.2. Frida 실습 & javascript API 사용
2.1 attach
실행 중인 애플리케이션 탐색
frida-ps -Ua
- 모든 프로세스를 보려면
-U
옵션만 추가합니다.
프로세스name
을 이용하여 디버깅
- 원하는 프로세스 이름을 입력하면, attach하여 작업 할 수 있습니다.
- 애플리케이션을 메모리에 올리면서 (실행시키면서) 디버깅 하고 싶다면
-f
옵션을 주면 됩니다.
2.2 frida-trace 실습
프로세스 확인
이전에 모바일 해킹을 실습 할 수 있었던
insecurebankv2
를 대상으로 실습해 보겠습니다.open
메서드 트레이싱
- frida에선 libc 등에 존재하는 method 에 대한 trace를 지원합니다. 예시로 insecurebank 애플리케이션에서 파일을 열 때 사용하는 open() 함수를 trace 해보겠습니다.
frida-trace -i "method" -U apk
를 사용하여 해당 애플리케이션에서open()
이벤트가 동작하면 추적하는 명령어를 사용합니다.
- 해당 추적 이벤트 로그는
현재 경로/__handlers__/libc.so/<method>.js
형태로 저장됩니다.
<method>.js
를 수정하게 되면, 로그 내용을 바꿀 수 있습니다.
- 예시로 생성된 open.js 를 살펴보겠습니다.
- 현재 생성된 파일에서는 그냥
open()
이 실행되면 로그를 찍히게 설정되어 있습니다.
- 해당 js파일을 약간 수정해서 args를 표시하도록 수정하고, 다시 같은 위치에서 같은 명령어를 실행시키면 다음과 같이 로그가 바뀝니다. (여기서 args는 인자입니다,)
- 뭔가 알 수 없지만 args[0] 주소 값이 찍히는 것을 볼 수 있습니다.
- 사실 명확히 하자면, open함수는
int fd = open("파일 이름", ~);
형태기 때문에 해당 메모리의 주소에 파일의 이름이 들어가 있습니다.
- 코드를 조금 더 수정해서 메모리 주소의 실제 경로를 구해보도록 하겠습니다.
- 앞서 진행한 것처럼
open.js
를 수정하여 저장합니다.
- 저장 후 실행하게 되면, 이번엔 insecurebankv2 애플리케이션을 사용할 때, open함수가 실행되게 되면, 해당 함수가 어떤 경로를 참조했는지 추적할 수 있습니다.
- 로그인을 수행할 경우 db를 참조하는 것을 볼 수 있습니다.
프로세스 종료
frida-kill -U <Name>
팁
frida -U
로 애플리케이션을 실행할 때 -f
옵션을 사용하면 spawn
상태가 되어 프로세스가 실행되고 메인 스레드가 시작되기 전 대기 상태가 되어도 세션이 종료되지 않습니다.2.3 Frida JS API
API (Application Programming Interface)
API란 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻합니다.
애플리케이션을 서로 연결하기 위한 통로 입구라고 생각하면 됩니다.
Frida JS API
Firida에서는 애플리케이션 분석, 흐름조작을 위하여 다양한 API를 제공합니다.
JS, C, Swift, GO
등이 존재하는데, 보편적으로 JS가 많이 쓰입니다.Frida에서 제공하는 JS API를 사용하게 되면, 다양한 모듈과, 메서드를 이용하여 다양한 작업을 수행할 수 있습니다.
🎯 사용할 수 있는 API들은 해당 사이트에 있습니다.
JS 스크립트 실습
모든 클래스의 이름을 출력하는 스크립트를 작성한 후, Frida를 사용하여 출력해 봅니다.
# allClassName.js Java.perform(function() { Java.enumerateLoadedClassess({ //클래스를 찾을 때마다 onMatch: function(className){ console.log(className) }, onComplete: function() {} }) }) =================================================== #/bin/bash frida -U FridaLab -l allClassName.js