MainActivity 내 chall04 함수. str 인자를 받고 frida와 일치하는지 비교한 뒤 일치하면 플래그 값을 1로 설정해 주고 있음
별도 xrefs가 없어 Challenge 2 때와 같이 직접 호출해 줘야
처음에 아래와 같이 Java.use를 써서 후킹해보았는데 attach가 잘 안 되었음. 그 이유가 무엇인가 알아보니, chall04 같은 경우 chall03과 달리 어디에서도 호출이 안 되다보니 메모리에 로드되지 않은 상태이기 때문이었음.
// 4
MainActivity.chall04.implementation = function (str) {
send('call MainActivity::chall04 with: ' + str);
this.chall04('frida');
}
그래서 onCreate에서 바로 호출되는 chall03 함수에서 chall04를 직접 호출하도록 하면 잘 동작
// 3
var MainActivity = Java.use('uk.rossmarks.fridalab.MainActivity');
MainActivity.chall03.implementation = function () {
send('call MainActivity::chall03');
var result = this.chall03();
this.chall04('frida)')
send('chall03 returned: ' + result);
send('modified result: true');
return true;
};
정리하자면 public/private/static 같은 키워드만으로 갈음할 수 없는 개념인 것 같음
최종적으로는 아래 코드와 같이 Java.choose 내에서 chall04 함수를 직접 호출해 주었음
Java.perform(function () {
// 1
var challenge_01 = Java.use('uk.rossmarks.fridalab.challenge_01');
challenge_01.getChall01Int.implementation = function () {
send('challenge_01::getChall01Int called');
var result = this.getChall01Int();
send('getChall01Int returned: ' + result);
send('modified result: 1\n');
return 1; // Or challenge_01.chall01.value = 1
};
// 2, 3, 4
Java.choose('uk.rossmarks.fridalab.MainActivity', {
onMatch: function (instance) {
send('Found instance: ' + instance);
// 2
send('call MainActivity::chall02');
instance.chall02();
// 3
// instance.chall03.implementation = function () {
// send('call MainActivity::chall03');
// var result = instance.chall03();
// send('chall03 returned: ' + result);
// send('modified result: true\n');
// return true;
// }
**// 4
send('call MainActivity:chall04("frida")\n')
instance.chall04('frida');**
},
onComplete: function () { }
});
// 3
var MainActivity = Java.use('uk.rossmarks.fridalab.MainActivity');
MainActivity.chall03.implementation = function () {
send('call MainActivity::chall03');
var result = this.chall03();
send('chall03 returned: ' + result);
send('modified result: true\n');
return true;
};
});