[Frida-Lab#6] 코드 분석 및 풀이

728x90

 

1. MainActivity에서 chall06 함수를 확인.

public void chall06(int arg3){
	if(challenge_06.confirmChall06.arg3)) {
    	this.completeArr[5] = 1;
	}	
}

challenge_06 클래스에서 confirmchall06을 호출한 뒤에 if 결과가 참이면 completeArrp[5] 6번 문제가 풀린다.

 

2. Java.use vs Java.choose?

fridalab 문제를 풀 때 가장 고민하게 되는 API 호출 함수 정하기.

Mainactivity에 있는 함수를 후킹하면 choose 독립된 클래스라면 use를 사용하는데, chall06은 mainactivity에도 있고 별도로challenge_06에도 있어서 둘 다 써줬다.

 

이전에 사용했던 스크립트를 모두 긁어모아 만들어낸 문제 해결 소스코드는 다음과 같다.

setTimeout(function() {
  Java.perform(function() {
    var cs6 = Java.use("uk.rossmarks.fridalab.challenge_06");
      Java.choose("uk.rossmarks.fridalab.MainActivity", 
      {
        onMatch: function(cs) {
          cs.chall06(challenge_06.chall06.value);
        },
        onComplete: function() {
          console.log("ok");
        }
      })
  })
}, 10000);

use로 challenge_06 클래스를 호출하고, choose를 통해 mainactivty의 chall06 메소드를 호출해 실행시킨다.

use 사용 후에 addchall06 함수를 후킹해야하는 거 아닌가 싶어 overload로 이리저리 끄적여보긴 했으나 먼저 푼 선배의 힌트로 use에서는 따로 명령줄을 쓸 필요가 없다는 사실을 얻어 과감하게 뺐다.

 

결과는... 

{'type': 'error', 'description': "ReferenceError: 'challenge_06' is not defined", 'stack': "ReferenceError: 'challenge_06' is not defined\n
at onMatch (/script1.js:8)\n    at _chooseObjectsArtLegacy (frida/node_modules/frida-java-bridge/lib/class-factory.js:323)\n    at <anonymous> 
(frida/node_modules/frida-java-bridge/lib/class-factory.js:250)\n    at vt (frida/node_modules/frida-java-bridge/lib/android.js:573)", 'fileName': 
'/script1.js', 'lineNumber': 8, 'columnNumber': 1} -> None

음. challenge_06이 정의되어 있지 않다고 한다. 뭐가 문제지 싶어 한동안 소스코드만 바라봤는데, 이게 웬걸.

 

setTimeout(function() {
  Java.perform(function() {
    var cs6 = Java.use("uk.rossmarks.fridalab.challenge_06");
      Java.choose("uk.rossmarks.fridalab.MainActivity", 
      {
        onMatch: function(cs) {
          cs.chall06(cs6.chall06.value);
        },
        onComplete: function() {
          console.log("ok");
        }
      })
  })
}, 10000);

MainActivity에 있는 chall06 함수에 Java.use로 호출할 challenge_06의 값을 넣어줘야하는데 

var cs6으로 선언해두고서 정작 cs.chall06(challenge_06.chall06.value)로 challenge_06 자체를 넣어뒀다.

 

새롭게 수정한 코드를뒤 실행을 하게 되면.

엥 진짜 풀렸다. 혹시 몰라 찾아본 fridalab 6번 문제의 스크립트들(다른 사람들이 푼 거)와는 전혀 다른 스크립트지만 어찌저찌 풀렸으면 된 게 아닐까? 제대로된 코드 분석과 원리는 조금 더 공부해서 추가해봐야겠다.

728x90