코드 설명
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
- Java.choose(Class Name, Callbacks)
안드로이드 앱 내부의 인스턴스를 다루기 위한 것으로, 힙에서 인스턴스화 된 객체를 찾아 callback으로 넘겨준다.
- onMatch : 일치하는 인스턴스를 찾을 경우 호출한다.
- onComplete : 일치하는 것을 모두 찾고난 후에 호출한다.
'워게임 > FridaLab' 카테고리의 다른 글
FridaLab Write Up - Challenge 05. 항상 chall05()에 "frida"를 전송하라. (0) | 2022.12.15 |
---|---|
FridaLab Write Up - Challenge 04. chall04()에 "Frida"를 전달하라. (0) | 2022.12.15 |
FridaLab Write Up - Challenge 03. Chall03()의 리턴 값을 True로 만들어라. (0) | 2022.12.15 |
FridaLab Write Up - Challenge 01. challenge_01 클래스의 chall01 변수의 값을 1로 변경해라 (0) | 2022.12.15 |
FridaLab Write Up - Download & Install (0) | 2022.12.15 |