본문 바로가기

4-2. 2024-1 심화 스터디/안드로이드 모의해킹

[5주차] 블레이드러너 - 안드로이드 모의 해킹

5주차부터는

[프리다(Frida)를 이용한 안드로이드 앱 모의해킹]

강의를 수강한다.

 

5주차 활동으로는 섹션1부터 섹션4까지 수강하는 것을 목표로 하였다.


 

프리다(Frida) 이해

 

프리다(Frida) 란?

 

>> 소개

- Ole가 개발한 DBI 프레임 워크

     - DBI란? Dynamic Binary Intrumentation의 약자

     - Instrumentation 이란? 앱이 실행중인 상태에서 코드 명령어를 삽입해 프로세스를 추적, 분석, 디버깅 하는 도구

- 다양한 플랫폼에서 프로세스에 대한 인젝션이 가능해 큰 확장성을 가진다.

- 윈도우, 맥OS, GNX/Linux, iOS, Android 및 QNX에서 자바스크립트를 네이티브 앱에 삽입 가능

-> 프로세스를 모니터/ 디버깅 하는 데 사용할 수 있는 툴킷

 

>> 주요기능

  • AppMon과 Needle 등의 도구에서 프리다를 기반으로 사용
  • 함수 후킹( 특정 함수에 연결하여 반환 값 변경, 함수 재작성 등)
  • 애플리케이션 디버깅 가능
  • 힙 메모리 내 객체 인스턴스 검색 및 사용
  • 실시간 트래픽 스니핑 또는 암호 해동
  • 탈옥 또는 루팅되지 않은 단말기에서도 사용 가능

>> 통신 방식

 

 

프리다 기능 살펴보기

 

Frida CLI

>> REPL 인터페이스로, 신속한 프로토타이핑과 손쉬운 디버깅을 목표로 한다.

 

옵션 설명
--version 프리다 프로그램 버전 출력
-h, --help 도움말 메시지 출력
-D ID, --device=ID 주어진 ID로 장치에 연결
--U, --usb USB 장치에 연결
-R, --remote 원격 프리다 서버에 연결
-H HOST, --host=HOST HOST의 원격 프리다 서버에 연결
-a, --applications 에플리케이션 리스트만 출력
-i, --installed 설치된 모든 애플리케이션 포함 출력
-I SCRIPT, --load=SCRIPT SCRIPT를 로드
-f FILE, --file=FILE spawn(스폰) FILE
--no-pause 시작할 때 자동으로 메인 쓰레드를 시작

 

 

frida-ps

>> 연결된 프로세스 목록을 출력하기 위한 도구

 

- frida-ps -U : 연결된 디바이스에서 실행중인 모든 프로세스 목록 출력

- frida-ps -Ua, frida-ps -Uai: USB로 연결된 디바이스에서 실행 중인 앱 목록

 

 

frida-ls-devices

>> 연결된 디바이스를 출력하는 도구

 

 

frida-trace

>> 크롬 프로세스에서 "open" APIs 함수 호출 추적

- frida-trace -i "검색하고 싶은 API" -U [앱 패키지 이름]

  ex)  frida-trace -i "open" -U com.android.chrome : Chrome 에서 발생하는 Function에 대해 기록하고 출력

 

frida-kill

>> 프로세스를 종료하는 명령 줄 도구

- frida-ps 명령어로 종료할 프로세스 확인

- frida-kill-U [process number]

 

 

 

프리다 기본 문법

 

>> 기본 뼈대 구조

 

* Java.perform(fn)

 - 현재 스레드가 가상머신에 연결되어 있는지 확인하고 fn을 호출

 

* Jave.use(classname)

 - 변수와 메소드에 엑세스 할 수 있는 클래스 객체를 변환

 - 메소드 구현을 변경하려면 새로운 메소드로 덮어 써야 함

 - 인스턴스를 반환하는 것이 아닌 클래스 객체를 반환함

 - 앱에서 사용하는 클래스와 연동되는 myClass를 정의

 - .implementation: 앱에서 정의된 메소드의 구현 내용을 재작성

 

 

* Java.choose(className, callbacks)

 - 힙에서 인스턴스화 된 객체 찾기 가능

 - callbacks: onMatch, onComplete

 - onMatch: 실시간으로 인스턴스에 대해 호출

 - onComplete: function()의 모든 인스턴스가 열거될 때 호출

 

* Java.enumeratelLoadedClasses(callbacks)

 - 로드된 모든 클래스를 열거하고 모든 일치 항목을 출력

 - onMatch: 일치하는 것을 찾으면 호출

 - onComplete : 가능한 일치(match)를 모두 마치면 사용됨

 

*setlmmediate(fn)

 - Process terminated 오류 해결하기

 

>> 메소드 구현을 재작성 할 때 '다형성' 유의!

 다음 세 가지의 경우엔... -> overload() 제공

  1. 입력 받는 인수가 없는 메소드
  2. 두 개의 바이트 배열을 인수로 입력 받는 메소드
  3. 앱의 context와 boolean 형태의 인수로 입력받는 메소드

 

 

프리다 CLI 활용

 

>> 프로세스에 스크립트를 인젝션하기 위한 사전 작업

  1. 애플리케이션 프로세스 실행 후 자바 스크립트 삽입
  2. 애플리케이션 프로세스 시작되기 전 자바스크립트 삽입

 

  • 애플리케이션 시작

- 프리다가 스크립트를 인젝션하려면 앱이 실행되어야 함

- frida -U com.android.chrome

 

  • Spawn

- -f 옵션을 사용하여 프로세스를 Spawn 해야 함

- frida -U -f com.android.chrome

 

  • Spawn 문제 해결

- 프로세스를 Spawn하면 일정 시간이 지나 메인 스레드가 시작되지 않고 죽는 경우 발생

- frida -U -f [Process name] 이후 %resume

 

- frida -U -f --no-pause [Process name]

 

>> 명령어 입력 쉘 획득

자바 스크립트 API를 사용하여 프리다에 명령어 사용 가능

- TAP: 사용 가능 명령어 확인

- 안드로이드: https://www.frida.re/docs/javascripts-api/#java