APP 진단/Android 2
11. 프리다 실무 활용 - Password 복호화 (UnCrackable-Level1.apk)
takudaddy
2022. 12. 13. 17:50
[목차]
1. 문제 확인
2. 소스 확인
3. 해결 방법 1
4. 해결 방법 2
1. 문제 확인
아무 데이터나 입력 후
VERIFY를 누르면
![](https://blog.kakaocdn.net/dn/ch3JMM/btrTzlJ6hUa/utO1fVH1KM57GnOMLfcuqk/img.png)
에러가 발생!
해당 검증을 우회해야 한다.
2. 소스 확인
![](https://blog.kakaocdn.net/dn/kxtMJ/btrTzkqTceF/n1NEQ04zKxCTaFJ7GW30k1/img.png)
![](https://blog.kakaocdn.net/dn/d4QsMU/btrTvj7npma/qc9oMLehzTpImm9JZWkJHk/img.png)
# a 클래스 확인
![](https://blog.kakaocdn.net/dn/chu50r/btrTzZ7FaRd/9x9pLTyOWqHqrmwBfu4Xmk/img.png)
# 암호화 로직 a 확인
![](https://blog.kakaocdn.net/dn/dg0EyQ/btrTzCSlwhS/WvNIWmP7uug04k72KCjko0/img.png)
3. 해결 방법 1
a 메서드 로직을 후킹해
내부 로직을 모두 삭제 후
![](https://blog.kakaocdn.net/dn/ctSeqe/btrTAcFQLB4/T7JY36tjo71KOL9akTajB0/img.png)
항상 return true가 반환 되도록 실행!
# 코드
setImmediate(function(){
Java.perform(function(){
var exitBypass = Java.use("java.lang.System");
exitBypass.exit.implementation = function (arg) {
console.log("[*] 루팅 탐지 후킹 성공!");
}
var always_true = Java.use("sg.vantagepoint.uncrackable1.a");
always_true.a.implementation = function(arg){
console.log("\n[+] true 반환!");
return true;
}
})
})
![](https://blog.kakaocdn.net/dn/qNK4O/btrTyCSWEQ4/74XKODWj3zIOS6OHa2HIg0/img.png)
![](https://blog.kakaocdn.net/dn/vPCAH/btrTzwq7qSd/xJwd35S3EF8o2WLSkLVm91/img.png)
해결 완료!
4. 해결 방법 2
![](https://blog.kakaocdn.net/dn/bZhIEk/btrTyDjYpUc/0NVkEviF4dZZwFqnYAB2kK/img.png)
a 메서드는 바이트 배열 값 출력
# 코드 작성
setImmediate(function(){
Java.perform(function(){
var exitBypass = Java.use("java.lang.System");
exitBypass.exit.implementation = function (arg) {
console.log("[*] 루팅 탐지 후킹 성공!");
}
/*var always_true = Java.use("sg.vantagepoint.uncrackable1.a");
always_true.a.implementation = function(arg){
console.log("\n[+] true 반환!");
return true;
}*/
var decryptClass = Java.use("sg.vantagepoint.a.a");
decryptClass.a.implementation = function(arg1, arg2){
var secret_string = this.a(arg1, arg2);
console.log("\n[+] Secret String ASCII 값 :"+ secret_string + "\n");
for(var i=0; i<secret_string.length; i++){
console.log("[+] Secret String 값 :"+ String.fromCharCode(secret_string[i]));
}
return secret_string;
}
})
})
![](https://blog.kakaocdn.net/dn/0ZttO/btrTzCLzXJA/7yktFUiz6oj14aoRjkhLq1/img.png)
![](https://blog.kakaocdn.net/dn/dXcI5k/btrTu2kr1Aw/dvkW296r4ZP8elipAbSsO1/img.png)
해결 완료!
# 출력값을 한 줄로 출력 코드
setImmediate(function(){
Java.perform(function(){
var exitBypass = Java.use("java.lang.System");
exitBypass.exit.implementation = function (arg) {
console.log("\n[*] 루팅 탐지 후킹 성공!\n");
}
/*var always_true = Java.use("sg.vantagepoint.uncrackable1.a");
always_true.a.implementation = function(arg){
console.log("\n[+] true 반환!");
return true;
}*/
/*var decryptClass = Java.use("sg.vantagepoint.a.a");
decryptClass.a.implementation = function(arg1, arg2){
var secret_string = this.a(arg1, arg2);
console.log("\n[+] Secret String ASCII 값 :"+ secret_string + "\n");
for(var i=0; i<secret_string.length; i++){
console.log("[+] Secret String 값 :"+ String.fromCharCode(secret_string[i]));
}
return secret_string;
}*/
var decryptClass = Java.use("sg.vantagepoint.a.a");
decryptClass.a.implementation = function(arg1, arg2){
var secret_string = this.a(arg1, arg2);
console.log("\n[+] Secret String ASCII 값 :"+ secret_string + "\n");
var secret_S = '' // 한줄 출력을 위해 추가해줌
for(var i=0; i<secret_string.length; i++){
secret_S += String.fromCharCode(secret_string[i])
}
console.log("[+] ASCII 복호화 값은 : " + secret_S);
return secret_string;
}
})
})
![](https://blog.kakaocdn.net/dn/qFxkp/btrTwAVnKxr/RfkLJvfPQThYm2SO5dt3HK/img.png)
끝
728x90