FridaLab 2번 문제 풀이
저번 시간에 이어서 , 2번 문제를 풀어보려 한다.
2번 문제는
Run chall02()이다.
실행을 시키면 문제를 해결할 수 있겠지?라는 생각으로 접근해보려 한다.
먼저 검색기능을 활용해 chall02() 함수를 찾아봤다.
MainActivity안에 있었고, 다른 함수와 다르게 빨간색으로 되어있는 것을 확인했다.
친절하게 경로가 이어져있어서 , 디컴파일을 해보았다.
이러한 내용을 발견했다.
이것만 보고는 completeArr 배열의 2번째 칸이 1이다. 정도의 정보만 얻었다.
MainActivity를 봤을 때, completeArr이라는 이름을 가진 길이가 8인 정수형 배열을 생성한다. 이때 completeArr배열의 모든 요소는 0으로 초기화되는 것을 볼 수 있다.
여기서 나는 이런 생각이 들었다.
chall02을 실행하게 되면 배열의 두 번째 칸이 1로 바뀌는 것이 이 문제를 푸는 방법인 것 같았다.
따라서 자바스크립트를 이용해 1번 문제와 동일하게 접근해보려 했다.
이 과정을 알아내는 부분이 굉장히 오래 걸렸다.
이 과정에서 Frida의 문법에 대해서 기본적으로 정리를 좀 하고 갔다.
https://hwan2story.tistory.com/18
Frida 문법
1. Java.perform 현재 스레드가 가상머신에 연결되었는지 확인하고 function을 호출한다. Java.perform(function(){ }); 2. Java.use(ClassName) 메소드 후킹 시 사용한다. var myClass = Java.use(com.mypackage.name.class) //앱에
hwan2story.tistory.com
문법을 알아보면서 첫 번째 문제와 비교를 해보게 되었는데 ,
잠깐 이 부분에 대해서 설명을 하고 가자면
1번 문제의 경우
Method가 다음과 같이 static으로 설정이 되어 있을 경우 프로그램 실행 시 메모리가 올라오기 때문에 instance가 필요 없다. 이럴 경우에는 java.use를 이용한다.
반면 , 2번 문제는
Method가 static이 아닌 모습을 확인할 수 있다. 이러한 경우에는 java.choose를 통해서 instance를 이용해야 한다.
위 문법을 이용해 코드를 짜보게 되면
setImmediate(function() {
Java.perform(function() {
var chall02 = Java.choose("uk.rossmarks.fridalab.MainActivity", { //MainActivity클래스 찾기
onMatch: function(chall_02) {
chall_02.chall02();
}, //onMatch함수로 MainActivity클래스 속 chall02() 메소드 호출 -> 2번문제 조건 충족
onComplete: function() {
console.log('good!!!');
}
});
});
});
이런 형식의 자바스크립트를 짤 수 있다. Method가 static이 아니라 java.choose함수를 이용하였고, onComplete를 이용해 제대로 전달이 되었을 경우 good!!!이라는 명령을 호출하도록 해보았다.
frida -U -l "C:\Users\tjrgh\sekurity\android\chall02.js" FridaLab
만들어 둔 chall02.js 스크립트를 이용하였다.
2번 문제를 해결하였다.