chall02함수를 실행시키기만 하면 통과인데 chall01문제처럼 static이 아니라 java.use를 사용할 수 없습니다.
이런 경우는 java.choose로 함수를 불러온 후 실행시키면 됩니다
Java.perform(function(){
var main;
Java.choose('uk.rossmarks.fridalab.MainActivity', {
onMatch: function(called_class) {
main = called_class;
},
onComplete: function() {}
});
main.chall02();
});
MainActivity안에 있는 chall02함수를 잡기 위해서 java.choose로 Mainactivity클래스를 잡은 후, onMatch, onComplete로 class의 임의의 이름을 지정해줍니다. 그리고 해당 클래스 안에 들어가 해당 이름의 함수를 실행시키면 됩니다.
cd /data/local/tmp
ls (frida-server파일 있는지 확인)
./frida-server(파일명) & (백그라운드로 frida-sever 실행
ps | grep server (frida-server 실행 확인)
3번째 줄에서 뭔 오류가 떠도 4번째 줄의 결과값에 frida-server가 있다면 계속 진행해도 좋다.
이제 안드로이드에서 후킹할 앱의 프로세스명을 알아내야 하는데,
adb devices
명령을 통해
연결한 ip와 포트를 알아내고,
frida-ps -D "127.0.0.1:62001" ("ip주소:port")
보인다 보여
(이제 밑의 내용은 owasp의 keystore문제를 예로 설명합니다)
대충 내가 후킹할 앱을 디컴해서 취약점을 본 후 코드를 작성했다고 가정해보자.
Java.perform(function(){
var Cipher = Java.use("javax.crypto.Cipher"); //load the Cipher class into a variable to access the init method
Cipher.init.overload('int', 'java.security.Key').implementation = function(opmode, key){ //hook the init method
if (opmode == 1) //encrypt opmode
{
var RSAPublicKey = Java.use("java.security.interfaces.RSAPublicKey"); //load the RSA interfaces into variables
var RSAKey = Java.use("java.security.interfaces.RSAKey");
var casted_RSAPublicKey = Java.cast(key, RSAPublicKey); //cast the key to obtain the public key and the exponent
var casted_RSAKey = Java.cast(key, RSAKey); //cast the key to obtain the modulus
var base64 = Java.use("android.util.Base64"); //load base64 class to encode byte array to base64 string
console.log("[*] Method 'init' is called with ENCRYPT_MODE opcode");
console.log("[*] Public key in Base64 format: " + base64.encodeToString(key.getEncoded(), 0));
console.log("[*] Exponent of the public key: " + casted_RSAPublicKey.getPublicExponent());
console.log("[*] Modulus of the public key: " + casted_RSAKey.getModulus());
}
return this.init(opmode, key);
}
});