[목차]

 

 

1. 기본 명령어 활용

2. 기본 명령어를 통한 디버깅 실습

     - 함수 트레이스 실습

 

 

 

 

 

 

1. 기본 명령어 활용

 

 

# frida

프리다 CLI인 REPL 인터페이스로

신속한 프로토타이핑과 손쉬운 디버깅이 목표인 도구

 

# frida-ps (-U, -Ua)

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

 

# frida-ls-devices

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

 

# frida-trace

함수 호출을 동적으로 추적하기 위한 도구

 

# frida-kill

프로세스를 종료하는 도구

 

# 기타 주요 옵션

 

 

 


 

 

2. 기본 명령어를 통한 디버깅 실습

 

1) 단말기에서 크롬 실행 후

프리다로 실행 중인 프로세스 확인

 

 

또는

com.android.chrome

 


 

 

2) 디버깅할 프로세스 프리다로 호출 실습

 

 

 


 

 

3) 프리다로 Java Script 파일 로드 실습

클래스 명을 호출하는 스크립트 작성 후 로드

Java.perform(function() {
    Java.enumerateLoadedClasses({
        onMatch: function(className) {
            console.log(className);
        },
        onComplete: function() {}
    });
});
 

 

 


 

 

4) 함수 트레이스 실습

 

# 실습 주제 :

크롬 프로세스에서 “open” API 함수 호출을 추적해 본다.

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

frida-trace -i “open” -U com.android.chrome

Chrome 앱에서 발생하는 Function에 대해 기록하고 출력

 

 

연결된 후 앱을 사용할 때마다

 

 

로그가 하나씩 출력되며

앱 내부 동작 모니터링이 가능하고

 

무슨 원리로 open() 함수가 찍히는지

핸들러 저장 경로에 들어가

open.js 파일을 살펴보면

 

 

실제 코드는 onEnter로

open()이라는 로그가

하나씩 출력 되는 중이며

 

아래 onLeave는

아무런 기능을 하지 않는다.

 

onEnter의 function 기능

인수에는 3가지,

logs / args / state를 받아오는데

 

 

해당 부분에 대해서는

별도로 처리해서 출력하는 것이 없으며

그냥 open() 함수가 실행되면

log를 하나씩 출력해 주기만 한다.

 

log, args, state 인수는 어떤 값을 받고

출력해 주는지 궁금하기 때문에

 

args를 통해 호출 인수가 어떻게 동작 중인지

확인해 본다.

 

자동으로 생성된 open.js 스크립트를

open() 함수에 대한 경로가 저장된 메모리 주소와

플래그 값이 출력되도록 해당 코드를

수정해 본다.

 onEnter(log, args, state) {
    log('open(' + 'pathname=' + args[0] + ', flags=' + args[1] + ')');
  },

// open 함수 관련해서 출력을 한다
// pathname은 문자열로 지정
// args 첫 번째, 두 번째 배열 가져온다
 

 

저장 후 실행해 보면

자동 생성되었던 open.js 파일을 가져오면서

크롬 앱을 만져보면

 

 

메모리 주소(pathname)와

플래그 값(flags) 확인이 가능하다.

 

이처럼 함수를 호출할 때

확인이 필요한 함수에

어떤 정보들이 노출되는지

확인이 가능!

 

 

[참고]

open 함수 등의 시스템 함수 등은

구글링을 통해 기능 확인이 가능!

 

 

# 프리다 API인 메모리 객체를 사용해

메모리 주소의 실제 경로를 확인해 본다.

https://frida.re/docs/javascript-api/

 

코드 작성 후

 onEnter(log, args, state) {
    log('open(' + 'pathname=' + Memory.readUtf8String(args[0]) + ', flags=' + args[1] + ')');
  },
 

 

로드한 뒤 앱을 만져보면

실제 호출 경로 확인이 가능한데

 

이처럼 특정 앱에서

어떤 함수가 언제 호출이 되고

호출 시 어떤 경로에서 호출이 되는지 등의

확인이 가능!

 


 

 

5) 프로세스 중지

프로세스 명이나 PID 번호 둘 다 입력 가능

 

 

 

 


 
 

[도움 출처]

: 보안프로젝트 김태영 팀장

 

 

728x90

+ Recent posts