본문 바로가기

Android

[WriteUp] Android - CrackMe

PTW_Crackme [2].apk
1.18MB

예전 PTW wargame을 운영할때 웹 이외에도 안드로이드, 리버싱 문제를 만든 적이 있다.

 

이 문서는 예전에 문제를 만들고 공부할겸 작성해놓은 write up이다.

 

문제 풀이에는 정답이 없으니 참고용으로만 보도록 하자.

 

먼저 앱 실행 시 루팅 탐지 메시지 출력되며 OK 클릭 시 종료된다.

 

jadx로 확인하면 a라는 클래스에서 해당 메시지 알림이 팝업됨

 

smali 코드로 확인하면 다음 그림과 같이 MainActivity$1 위치에 있음

 

후킹코드 작성

Java.perform(function() {

console.log("[*] Start Hooking");

//해당 함수 경로 지정

var exitClass = Java.use("kr.alonalab.ptw.crackme.MainActivity$1");

//onClick에 implementation으로 후킹

exitClass.onClick.implementation = function(v){

//OK됬을 시 콘솔 로그로

console.log("[*] System.exit Called");

}

 

 

패스워드 검증 로직에서 AES_Decode 함수를 통해 복호화된 키값과 s1을 비교하는 구문이 보인다.

 

해당 함수를 보면 String으로 된 값 을 받아 복호화 하는 것을 볼 수 있으며 이 함수를 후킹하여 값을 알아내도록 한다.

 

후킹코드

 

//대상 함수 경로 설정
var LoadVerify = Java.use("kr.alonalab.ptw.crackme.AES256Chiper");//Decode는 String으로 인자을 받으므로 java.lang.String으로 설정 
LoadVerify.AES_Decode.overload('java.lang.String').implementation = function(arg0)
{
	//Decode에 들어오는 값을 출력
    console.log("[*] input -> " + arg0);
    //ret값을 알기 위해 Decode함수를 다시 콜 하여 값 추출
    var ret = this.AES_Decode.overload("java.lang.String").call(this, arg0);
    console.log("[*] output -> "+ ret);
    return ret;
 }