코드 설명

MainActivity
MainActivity

MainActivity에서 chall02 함수가 정의되어 있지만, 호출하는 코드가 없는 것을 확인되었다.

chall02 함수는 completerArr의 1번 인덱스의 값에 1을 지정하는 것뿐인 함수였다.

Write Up

Java.perform(() => {
  console.log("\n* Hooking Start *")

  var challenge02 = () => {
      Java.choose("uk.rossmarks.fridalab.MainActivity", {
          "onMatch": (instense) => instense.chall02(),
          "onComplete": () => console.log("challenge_02 solved!")
      })
  }

  // Hooking Function Call
  challenge02()
})
 

앞서 코드 분석에서 MainActivity 클래스의 chall02 메소드가 클래스 메소드가 아닌 인스턴스 메소드인 것을 확인하였다. 그래서 인스턴스 메소드를 동작 하게끔 하는 API인 Java.choose 메소드를 사용하여 chall02 메소드를 동작시켰다.

 

1번 문제와 다른 점은 frida-client에서 -f 옵션을 사용하여 Hooking 대상을 지정한 것이 아닌 -p 옵션을 사용하여 미리 실행된 Hooking 대상을 지정하였다. 이렇게 한 이유는 Client 측에서 Frida의 -f 옵션을 사용할 때 Java.choose 메소드가 인스턴스 메소드를 제대로 인식 못 하는 문제점이 발생하였다.

 

몇 번 테스트를 해보니, -f 옵션을 사용 시 Hooking 대상이 다시 커지고 Hooking Function이 동작하여 인스턴스된 객체를 인식하는 타이밍이 어긋난 것으로 추측된다.

 

그래서 미리 실행된 Hooking 대상의 PID를 이용하여 frida-clent의 -p 옵션을 이용하여 Hooking를 시도하니 인식이 잘 되었다.

 

사용된 API

  1. Java.choose(Class Name, Callbacks)
    안드로이드 앱 내부의 인스턴스를 다루기 위한 것으로, 힙에서 인스턴스화 된 객체를 찾아 callback으로 넘겨준다.
    - onMatch : 일치하는 인스턴스를 찾을 경우 호출한다.
    - onComplete : 일치하는 것을 모두 찾고난 후에 호출한다.

 

복사했습니다!