[Mobile Hacking] / [OWASP MAS Crackme L01]
2025. 8. 6. 19:43ㆍWriteUp & Reference - Wargames, CTFs/Mobile
728x90
문제 원본 : https://mas.owasp.org/crackmes/
MAS Crackmes - OWASP Mobile Application Security
MAS Crackmes Welcome to the MAS Crackmes aka. UnCrackable Apps, a collection of mobile reverse engineering challenges. These challenges are used as examples throughout the OWASP MASTG. Of course, you can also solve them for fun.
mas.owasp.org
위 링크에서 다운받을 수 있다.
분류를 모바일 포렌식이라 했는데.. 이거 리버싱이 더 정확한거같다..
요새 포렌식은 리버싱인듯 어쩌구..
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="owasp.mstg.uncrackable1">
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="28" />
<application
android:theme="@ref/0x7f070000"
android:label="@ref/0x7f060001"
android:icon="@ref/0x7f050000"
android:allowBackup="true">
<activity
android:label="@ref/0x7f060001"
android:name="sg.vantagepoint.uncrackable1.MainActivity">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>- 모바일 리버싱에서 공부하고자 하면 가장 먼저 들어가야할 파일은 AndroidManifest.xml이다. 위 코드는 jadx로 까본 코드이다.
- 여기서 문제와 관련된 힌트는 다음 코드 부분이다.
<activity
android:label="@ref/0x7f060001"
android:name="sg.vantagepoint.uncrackable1.MainActivity">- 액티비티 패키지 명이 쓰여있다. 이 패키지로 들어가본다.

if (c.a() || c.b() || c.c()) { a("Root detected!"); }
- c 클래스는 루팅 탐지를 담당하는 유틸리티 클래스이고, a(), b(), c()는 각각 다른 루팅 탐지 기법을 수행하는 것으로 추정된다.
메서드 가능한 기능
| c.a() | su 명령어나 바이너리 존재 여부 확인 (/system/bin/su) |
| c.b() | 루팅 앱 존재 여부 확인 (Superuser.apk, Magisk) |
| c.c() | 시스템 속성(build tags) 또는 루팅 흔적 확인 |
→ Frida로 풀려면 c 메서드의 후킹 영역을 우회한다.
frida 후킹에 쓸 코드는 다음과 같다.
console.log("[+] Running Hook");
Java.perform(function() {
var hook = Java.use("sg.vantagepoint.a.c");
hook.a.implementation = function() {
console.log("[+] Hooked a() method");
return false;
}
hook.b.implementation = function() {
console.log("[+] Hooked b() method");
return false;
}
hook.c.implementation = function() {
console.log("[+] Hooked c() method");
return false;
}
});
- hook.js 스크립트를 작성한 후
frida -U -f owasp.mstg.uncrackable1 -l C:\\hook.js
명령어를 실행해준 후 블루스택으로 apk를 열어주면

루팅이 탐지되지 않는다.
이제 저기에 입력할 secret string을 작성해야한다.
package sg.vantagepoint.uncrackable1;
import android.util.Base64;
import android.util.Log;
/* loaded from: classes.dex */
public class a {
public static boolean a(String str) {
byte[] bArrA;
byte[] bArr = new byte[0];
try {
bArrA = sg.vantagepoint.a.a.a(b("8d127684cbc37c17616d806cf50473cc"), Base64.decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=", 0));
} catch (Exception e) {
Log.d("CodeCheck", "AES error:" + e.getMessage());
bArrA = bArr;
}
return str.equals(new String(bArrA));
}
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;
}
}
- 위 코드에 따르면 키 값은 8d127684cbc37c17616d806cf50473cc이고, 5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=로 암호화된 값을 가진다.
- 코드를 보면 AES 암호를 쓰고 있는 것을 알 수 있다.
from Crypto.Cipher import AES
from base64 import b64decode
key = bytes.fromhex("8d127684cbc37c17616d806cf50473cc")
cipher_text = b64decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=")
cipher = AES.new(key, AES.MODE_ECB)
plaintext = cipher.decrypt(cipher_text)
print("Secret String:", plaintext.decode('utf-8'))
- I want to believe가 secret string임을 알 수 있다.

728x90
'WriteUp & Reference - Wargames, CTFs > Mobile' 카테고리의 다른 글
| [Android MobileHacking] Android UnCrackable Level2 Write-up (0) | 2025.11.17 |
|---|---|
| [MobileHacking.kr] Mobile Baby Analysis2 (0) | 2025.11.14 |
| [MobileHacking.kr] Mobile Baby Analysis1 (0) | 2025.11.14 |
| [Mobilehacking.kr] ProjectApp 문제 Write-up (0) | 2025.11.12 |
| [WriteUp] / [BeetleBug - Unprotected Activity] Mobile Forensic (0) | 2025.05.14 |