이전 포스팅에서 UnCrackable-Level1.apk의 루팅 탐지를 우회하여 앱 종료를 방지했습니다. 이번 포스팅에서는 앱의 "Enter the Secret String"입력란에 필요한 비밀 문자열을 찾아 입력하여 문제를 완전히 해결하는 과정을 알아보겠습니다.
문제: 앱 실행 후 "Enter the Secret String"입력란이 나타나며, 올바른 비밀 문자열을 입력해야 합니다.
비밀문자열을 찾아 입력란에 입력하여 "Success!" 메시지를 확인해야 합니다.
비밀 문자열 검증 로직을 찾기 위해 UnCrackable-Level1.apk를 jadx로 열어 분석하겠습니다.
소스코드 확인 (verify)
public void verify(View view) {
String str;
String obj = ((EditText) findViewById(R.id.edit_text)).getText().toString();
AlertDialog create = new AlertDialog.Builder(this).create();
if (a.a(obj)) {
create.setTitle("Success!");
str = "This is the correct secret.";
} else {
create.setTitle("Nope...");
str = "That's not it. Try again.";
}
}
소스코드 확인 (a.a)
public class a {
public static boolean a(String str) {
byte[] bArr;
byte[] bArr2 = new byte[0];
try {
bArr = sg.vantagepoint.a.a.a(b("8d127684cbc37c17616d806cf50473cc"), Base64.decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=", 0));
} catch (Exception e) {
Log.d("CodeCheck", "AES error:" + e.getMessage());
bArr = bArr2;
}
return str.equals(new String(bArr));
}
public static byte[] b(String str) {
int length = str.length();
byte[] bArr = new byte[length / 2];
for (int i = 0; i < length; i += 2) {
bArr[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + Character.digit(str.charAt(i + 1), 16));
}
return bArr;
}
}
복호화 로직 분석
public class a {
public static byte[] a(byte[] bArr, byte[] bArr2) {
SecretKeySpec secretKeySpec = new SecretKeySpec(bArr, "AES/ECB/PKCS7Padding");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(2, secretKeySpec);
return cipher.doFinal(bArr2);
}
}
파이썬과 pycryptodome 라이브러리를 사용하여 AES 복호화를 수행하겠습니다. 단계별 과정은 다음과 같습니다.
1. 도구 가져오기
from Crypto.Cipher import AES
from base64 import b64decode
2. 암호문과 키 넣기
from Crypto.Cipher import AES
from base64 import b64decode
encrypted = "5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc="
key_hex = "8d127684cbc37c17616d806cf50473cc"
3. 암호문 포장 풀기
from Crypto.Cipher import AES
from base64 import b64decode
encrypted = "5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc="
key_hex = "8d127684cbc37c17616d806cf50473cc"
encrypted_bytes = b64decode(encrypted)
print("포장 푼 암호문:", encrypted_bytes.hex())
4. 키 준비하기
from Crypto.Cipher import AES
from base64 import b64decode
encrypted = "5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc="
key_hex = "8d127684cbc37c17616d806cf50473cc"
encrypted_bytes = b64decode(encrypted)
key_bytes = bytes.fromhex(key_hex)
print("포장 푼 암호문:", encrypted_bytes.hex())
print("준비된 키:", key_bytes.hex())
5. 암호풀기
from Crypto.Cipher import AES
from base64 import b64decode
encrypted = "5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc="
key_hex = "8d127684cbc37c17616d806cf50473cc"
encrypted_bytes = b64decode(encrypted)
key_bytes = bytes.fromhex(key_hex)
cipher = AES.new(key_bytes, AES.MODE_ECB)
decrypted_bytes = cipher.decrypt(encrypted_bytes)
print("푼 암호:", decrypted_bytes.hex())
6. 불필요한 부분 제거
from Crypto.Cipher import AES
from base64 import b64decode
encrypted = "5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc="
key_hex = "8d127684cbc37c17616d806cf50473cc"
encrypted_bytes = b64decode(encrypted)
key_bytes = bytes.fromhex(key_hex)
cipher = AES.new(key_bytes, AES.MODE_ECB)
decrypted_bytes = cipher.decrypt(encrypted_bytes)
padding_len = decrypted_bytes[-1]
plain_bytes = decrypted_bytes[:-padding_len]
print("불필요한 부분 제거 후:", plain_bytes.hex())
7. 정답 읽기
from Crypto.Cipher import AES
from base64 import b64decode
encrypted = "5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc="
key_hex = "8d127684cbc37c17616d806cf50473cc"
encrypted_bytes = b64decode(encrypted)
key_bytes = bytes.fromhex(key_hex)
cipher = AES.new(key_bytes, AES.MODE_ECB)
decrypted_bytes = cipher.decrypt(encrypted_bytes)
padding_len = decrypted_bytes[-1]
plain_bytes = decrypted_bytes[:-padding_len]
plain_text = plain_bytes.decode('utf-8')
print("복호화된 평문:", plain_text)
이번 포스팅에서는 UnCrackable-Level1.apk의 비밀 문자열을 AES 복호화를 통해 찾아 입력하는 방법을 배웠습니다. jadx-gui로 검증 로직을 분석하고, 파이썬과 pycrytodome 라이브러리를 사용하여 AES/ECB/PKCS7Padding 복호화를 수행하여 비밀 문자열 "I want to believe"를 도출했습니다. 이 과정을 통해 앱의 암호화된 데이터를 분석하고 문제를 해결하는 방법을 익혔습니다.
브루트포스 활용 (0) | 2025.04.23 |
---|---|
로그인 우회 (0) | 2025.04.22 |
루팅 탐지 우회 (0) | 2025.04.19 |
FridaLab_08 (0) | 2025.04.18 |
FridaLab_07 (1) | 2025.04.17 |