Frida Tutorial 3
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์ด ํฌ์คํธ์ ์์ฝ: https://joshspicer.com/android-frida-1
APK: https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk
Solution 1
https://joshspicer.com/android-frida-1์ ๊ธฐ๋ฐ์ผ๋ก
_exit()_ ํจ์๋ฅผ ํํนํ๊ณ decrypt function์ ์ฌ์ฉํ์ฌ verify๋ฅผ ๋๋ฅผ ๋ flag๋ฅผ frida ์ฝ์์ ์ถ๋ ฅํ๋๋ก ํ์ธ์:
Java.perform(function () {
send("Starting hooks OWASP uncrackable1...")
function getString(data) {
var ret = ""
for (var i = 0; i < data.length; i++) {
ret += "#" + data[i].toString()
}
return ret
}
var aes_decrypt = Java.use("sg.vantagepoint.a.a")
aes_decrypt.a.overload("[B", "[B").implementation = function (var_0, var_1) {
send(
"sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding"
)
send("Key : " + getString(var_0))
send("Encrypted : " + getString(var_1))
var ret = this.a.overload("[B", "[B").call(this, var_0, var_1)
send("Decrypted : " + getString(ret))
var flag = ""
for (var i = 0; i < ret.length; i++) {
flag += String.fromCharCode(ret[i])
}
send("Decrypted flag: " + flag)
return ret //[B
}
var sysexit = Java.use("java.lang.System")
sysexit.exit.overload("int").implementation = function (var_0) {
send("java.lang.System.exit(I)V // We avoid exiting the application :)")
}
send("Hooks installed.")
})
Solution 2
Based in https://joshspicer.com/android-frida-1
๋ฃจํธ ์ฒดํฌ๋ฅผ ํํนํ๊ณ decrypt ํจ์๋ฅผ ์์ ํ์ฌ verify๋ฅผ ๋๋ฅผ ๋ frida ์ฝ์์ ํ๋๊ทธ๋ฅผ ์ถ๋ ฅํ๊ฒ ํ์ธ์:
Java.perform(function () {
send("Starting hooks OWASP uncrackable1...")
function getString(data) {
var ret = ""
for (var i = 0; i < data.length; i++) {
ret += "#" + data[i].toString()
}
return ret
}
var aes_decrypt = Java.use("sg.vantagepoint.a.a")
aes_decrypt.a.overload("[B", "[B").implementation = function (var_0, var_1) {
send(
"sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding"
)
send("Key : " + getString(var_0))
send("Encrypted : " + getString(var_1))
var ret = this.a.overload("[B", "[B").call(this, var_0, var_1)
send("Decrypted : " + getString(ret))
var flag = ""
for (var i = 0; i < ret.length; i++) {
flag += String.fromCharCode(ret[i])
}
send("Decrypted flag: " + flag)
return ret //[B
}
var rootcheck1 = Java.use("sg.vantagepoint.a.c")
rootcheck1.a.overload().implementation = function () {
send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()")
return false
}
var rootcheck2 = Java.use("sg.vantagepoint.a.c")
rootcheck2.b.overload().implementation = function () {
send("sg.vantagepoint.a.c.b()Z Root check 2 HIT! test-keys")
return false
}
var rootcheck3 = Java.use("sg.vantagepoint.a.c")
rootcheck3.c.overload().implementation = function () {
send("sg.vantagepoint.a.c.c()Z Root check 3 HIT! Root packages")
return false
}
var debugcheck = Java.use("sg.vantagepoint.a.b")
debugcheck.a.overload("android.content.Context").implementation = function (
var_0
) {
send("sg.vantagepoint.a.b.a(Landroid/content/Context;)Z Debug check HIT! ")
return false
}
send("Hooks installed.")
})
Solution 3 โ frida-trace (Frida โฅ 16)
์์ผ๋ก ํ ์ ์์ฑํ๊ณ ์ถ์ง ์๋ค๋ฉด Frida๊ฐ Java ์คํ ์ ์์ฑํ๋๋ก ํ๊ณ , ๊ทธ ํ์ ์์ ํ ์ ์์ต๋๋ค:
# Spawn the application and automatically trace the Java method we care about
aadb shell "am force-stop owasp.mstg.uncrackable1"
frida-trace -U -f owasp.mstg.uncrackable1 \
-j 'sg.vantagepoint.a.a.a("[B","[B")[B' \
-j 'sg.vantagepoint.a.c!*' \
--output ./trace
# The first run will create ./trace/scripts/sg/vantagepoint/a/a/a__B_B_B.js
# Edit that file and add the logic that prints the decrypted flag or
# returns a constant for the root-checks, then:
frida -U -f owasp.mstg.uncrackable1 -l ./trace/_loader.js --no-pause
Frida 16+์์๋ ์์ฑ๋ ์คํ
์ด ์ด๋ฏธ ํ๋์ ์ธ ES6 ํ
ํ๋ฆฟ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉฐ ๋ด์ฅ๋ QuickJS ๋ฐํ์์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค โ ๋ ์ด์ frida-compile์ด ํ์ํ์ง ์์ต๋๋ค.
Solution 4 โ One-liner with Objection (2024)
Objection >1.12๊ฐ ์ค์น๋์ด ์๋ค๋ฉด ๋จ์ผ ๋ช ๋ น์ด๋ก ํ๋๊ทธ๋ฅผ ๋คํํ ์ ์์ต๋๋ค (Objection์ ๋ด๋ถ์ ์ผ๋ก Frida๋ฅผ ๋ํํฉ๋๋ค):
objection -g owasp.mstg.uncrackable1 explore \
--startup-command "android hooking watch class sg.vantagepoint.a.a method a \n && android hooking set return_value false sg.vantagepoint.a.c * \n && android hooking invoke sg.vantagepoint.a.a a '[B' '[B'"
watch class๋ AES ๋ฃจํด์์ ๋ฐํ๋ ํ๋ฌธ์ ์ถ๋ ฅํฉ๋๋ค.set return_value false๋ ๋ชจ๋ ๋ฃจํธ / ๋๋ฒ๊ฑฐ ๊ฒ์ฌ๊ฐ false๋ฅผ ๋ณด๊ณ ํ๋๋ก ๊ฐ์ ํฉ๋๋ค.invoke๋ Verify๋ฅผ ๋๋ฅด์ง ์๊ณ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ์ ์๊ฒ ํด์ค๋๋ค.
NOTE: Android 14 (API 34)์์๋ seccomp-bpf ์ ํ์ผ๋ก ์ธํด attach๊ฐ ์ฐจ๋จ๋๋ฏ๋ก Objection/Frida๋ฅผ spawn ๋ชจ๋(
-f)๋ก ์คํํด์ผ ํฉ๋๋ค.
ํ๋ Android ๋ ธํธ (2023 - 2025)
- libsu 5.x์ Zygisk๋ su๋ฅผ ๊ฝค ์ ์จ๊ธฐ์ง๋ง, Level 1์ Java ๊ธฐ๋ฐ ๊ฒ์ฌ๋
/system/bin/suํ์ผ์ด ์กด์ฌํ๋ฉด ์ฌ์ ํ ์คํจํฉ๋๋ค. denylist๋ฅผ ํ์ฑํํ๊ฑฐ๋ Frida๋กjava.io.File.exists()๋ฅผ ํ ํนํด์ผ ํฉ๋๋ค. - Frida 16.1์ Google์ Scudo ํ ๋น๊ธฐ๋ก ์ธํด ๋ฐ์ํ Android 12/13์ ์ถฉ๋์ ์์ ํ์ต๋๋ค.
Abort message: 'missing SHADOW_OFFSET'๊ฐ ํ์๋๋ฉด Frida๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ๋ฏธ๋ฆฌ ๋น๋๋ 17.0 ์ผ๊ฐ ๋ฒ์ ์ ์ฌ์ฉํ์ธ์. - Play Integrity๊ฐ 2023๋
์ SafetyNet์ ๋์ฒดํ๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ต์ ์ฑ์ com.google.android.gms.tasks.Task API๋ฅผ ํธ์ถํฉ๋๋ค. Level 1์ ๊ทธ๋ ์ง ์์ง๋ง, ์ฌ๊ธฐ์ ๋ณด์ฌ์ค ๋์ผํ ํ
ํน ์ ๋ต์ด ์๋ํฉ๋๋ค โ
com.google.android.gms.safetynet.SafetyNetClient๋ฅผ ํ ํนํ๊ณ ์์กฐ๋ EvaluationType์ ๋ฐํํ์ธ์.
References
- Frida ๋ฆด๋ฆฌ์ค ๋ฐํ โ โFrida 16.0 (2023-04-02): Android 12/13 ์์ ์ฑ ์์ ๋ฐ spawn API ๊ฐํธโ
- Objection 1.12 โ โAndroid 14๋ฅผ ์ํ Spawn-only ๋ชจ๋โ (BlackHat USA 2024 ๋ฐํ ์ฌ๋ผ์ด๋)
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


