Frida Tutorial 1
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://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
μμ€ μ½λ: https://github.com/t0thkr1s/frida-demo
Python
Fridaλ μ€ν μ€μΈ μ ν리μΌμ΄μ μ ν¨μ λ΄μ JavaScript μ½λλ₯Ό μ½μ ν μ μκ² ν΄μ€λλ€. νμ§λ§ pythonμ μ¬μ©νμ¬ νν¬λ₯Ό νΈμΆνκ³ νν¬μ μνΈμμ©ν μλ μμ΅λλ€.
μ΄κ²μ μ΄ νν 리μΌμ λͺ¨λ μ μλ μμ μ ν¨κ» μ¬μ©ν μ μλ κ°λ¨ν python μ€ν¬λ¦½νΈμ λλ€:
#hooking.py
import frida, sys
with open(sys.argv[1], 'r') as f:
jscode = f.read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()
μ€ν¬λ¦½νΈλ₯Ό νΈμΆνμΈμ:
python hooking.py <hookN.js>
pythonμ fridaμ ν¨κ» μ¬μ©νλ λ°©λ²μ μλ κ²μ μ μ©νμ§λ§, μ΄ μμ μμλ λͺ λ Ήμ€ frida λꡬλ₯Ό μ¬μ©νμ¬ μ§μ Fridaλ₯Ό νΈμΆν μλ μμ΅λλ€:
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
Hook 1 - Boolean Bypass
μ¬κΈ°μμ ν΄λμ€ _infosecadventures.fridademo.utils.PinUtil_μ boolean λ©μλ (checkPin)λ₯Ό hookνλ λ°©λ²μ λ³Ό μ μμ΅λλ€.
//hook1.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")
var MainActivity = Java.use("infosecadventures.fridademo.utils.PinUtil")
MainActivity.checkPin.implementation = function (pin) {
console.log("[ + ] PIN check successfully bypassed!")
return true
}
})
python hooking.py hook1.js
보μΈμ: ν¨μλ λ§€κ°λ³μλ‘ Stringμ λ°μ΅λλ€. μ€λ²λ‘λκ° νμνμ§ μλμ?
Hook 2 - Function Bruteforce
Non-Static Function
ν΄λμ€μ λΉμ μ ν¨μλ₯Ό νΈμΆνλ €λ©΄ λ¨Όμ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€κ° νμν©λλ€. κ·Έλ° λ€μ, κ·Έ μΈμ€ν΄μ€λ₯Ό μ¬μ©νμ¬ ν¨μλ₯Ό νΈμΆν μ μμ΅λλ€.
μ΄λ₯Ό μν΄ κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό μ°Ύμμ μ¬μ©ν μ μμ΅λλ€:
Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
Java.choose("infosecadventures.fridademo.utils.PinUtil", {
onMatch: function (instance) {
console.log("[ * ] Instance found in memory: " + instance)
for (var i = 1000; i < 9999; i++) {
if (instance.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
break
}
}
},
onComplete: function () {},
})
})
μ΄ κ²½μ° μΈμ€ν΄μ€κ° μκ³ ν¨μκ° μ μ μ΄κΈ° λλ¬Έμ μλνμ§ μμ΅λλ€.
μ μ ν¨μ
ν¨μκ° μ μ μ΄λΌλ©΄, κ·Έλ₯ νΈμΆν μ μμ΅λλ€:
//hook2.js
Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
var PinUtil = Java.use("infosecadventures.fridademo.utils.PinUtil")
for (var i = 1000; i < 9999; i++) {
if (PinUtil.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
}
}
})
Hook 3 - μΈμ λ° λ°ν κ° κ°μ Έμ€κΈ°
ν¨μλ₯Ό ννΉνμ¬ μ λ¬λ μΈμμ κ°κ³Ό λ°ν κ°μ κ°μ μΆλ ₯νλλ‘ λ§λ€ μ μμ΅λλ€:
//hook3.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")
var EncryptionUtil = Java.use(
"infosecadventures.fridademo.utils.EncryptionUtil"
)
EncryptionUtil.encrypt.implementation = function (key, value) {
console.log("Key: " + key)
console.log("Value: " + value)
var encrypted_ret = this.encrypt(key, value) //Call the original function
console.log("Encrypted value: " + encrypted_ret)
return encrypted_ret
}
})
μ€μ
μ΄ νν 리μΌμμλ λ©μλμ μ΄λ¦κ³Ό _.implementation_μ μ¬μ©νμ¬ λ©μλλ₯Ό ννΉνμ΅λλ€. κ·Έλ¬λ κ°μ μ΄λ¦μ κ°μ§ λ©μλκ° μ¬λ¬ κ° μμ κ²½μ°, ννΉνλ €λ λ©μλλ₯Ό μ§μ ν΄μΌ νλ©° μΈμμ μ νμ νμν΄μΌ ν©λλ€.
λ€μ νν 리μΌμμ μ΄λ₯Ό νμΈν μ μμ΅λλ€.


