Kye0m's Security

[injuredandroid.apk] Flag Six - Login3 본문

앱 모의해킹/Injuredandroid.apk

[injuredandroid.apk] Flag Six - Login3

Kye0m 2022. 9. 12. 20:56

Login 1,2 문제와 마찬가지로 특정 플래그 값을 입력하여 푸는 문제이다.

 

문제풀이

public final void submitFlag(View view) {
        EditText editText = (EditText) findViewById(i.editText3);
        d.m.b.d.b(editText, "editText3");
        if (d.m.b.d.a(editText.getText().toString(), k.a("k3FElEG9lnoWbOateGhj5pX6QsXRNJKh///8Jxi8KXW7iDpk2xRxhQ=="))) {
            Intent intent = new Intent(this, FlagOneSuccess.class);
            FlagsOverview.D = true;
            new j().b(this, "flagSixButtonColor", true);
            startActivity(intent);
        }
    }

FlagSixLoginActivity중 submitFlag 부분만 가져왔다.

if문을 통해, 입력받은 값과 k클래스의 a(k3FElEG9lnoWbOateGhj5pX6QsXRNJKh///8Jxi8KXW7iDpk2xRxhQ==)

값과 비교한다는 것을 알 수 있다.

public static String a(String str) {
    if (c(str)) {
        try {
            SecretKey generateSecret = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(f1917a));
            byte[] decode = Base64.decode(str, 0);
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(2, generateSecret);
            return new String(cipher.doFinal(decode));
        } catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | BadPaddingException | IllegalBlockSizeException | NoSuchPaddingException e) {
            e.printStackTrace();
        }
    } else {
        System.out.println("Not a string!");
    }
    return str;
}

이를 따라가보면 입력받은 값을 Base64로 디코딩하여, DES를 통한 암호화를 진행하는 것을 알 수 있다.

 

이번엔 Frida를 이용해서 애플리케이션 내부에 자바스크립트 코드를 삽입하여 복호화를 진행해볼 예정이다.

우선 adb shell 을 통해서 nox에서 프리다 서버를 실행시켜준다.

frida -U b3nac.injuredandroid -l 실행시킬 자바스크립트파일

 

자바 스크립트 파일은 아래와 같이 작성해준다.

console.log("Script loaded successfully");
Java.perform(function x() {
	var my_class = Java.use("b3nac.injuredandroid.k");

	var string_class = Java.use("java.lang.String");

	my_class.a.overload("java.lang.String").implementation = function (args) {

		var my_string = string_class.$new("k3FElEG9lnoWbOateGhj5pX6QsXRNJKh///8Jxi8KXW7iDpk2xRxhQ==");
		var ret = this.a(my_string);
		console.log("Return value: " + ret);
		return ret;
	};
});

이렇게하면 항상 고정된 값을 복호화 하여 전달하기 때문에 어떠한 값을 입력하더라도 원하는 플래그값을 리턴으로 받을 수 있다.