๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”’์ •๋ณด๋ณด์•ˆ/๋ชจ๋ฐ”์ผ ๋ณด์•ˆ

ํ”„๋ฆฌ๋‹ค - Uncrackable1 ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์ œํ•˜๊ธฐ

by Janger 2022. 6. 24.
728x90
๋ฐ˜์‘ํ˜•

์ด๋ฒˆ์—๋Š” ๋ฃจํŠธ ๊ฐ์ง€ ์šฐํšŒ๋ฅผ ์ด์–ด์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์šฐํšŒ๋ฅผ ํ•ด๋ณด๊ฒ ๋‹ค. 

 

์ด๋ฒˆ์—๋Š” ๊ตณ์ด ๋ฃจํŒ…์ด ํ•„์š”์—†์œผ๋‹ˆ๊น ๋…น์Šค ์„ค์ •์—์„œ ROOT๋ฅผ ๊บผ์ฃผ์—ˆ๋‹ค. 

 

์•ฑ ๋ถ„์„

๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ EditText์— ์•„๋ฌด ๊ธ€์ž๋ฅผ ๋„ฃ๊ณ  ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋งž๋Š” ์ •๋‹ต์ด ์•„๋‹ˆ๋ผ๊ณ  ๋œฌ๋‹ค. 

 

์ด๋ฒˆ ๋ชฉํ‘œ๋Š” ์ด๋ฅผ ์šฐํšŒํ•˜์—ฌ ์„ฑ๊ณต์ด ๋œจ๊ฒŒํ•˜๋Š” ๊ฒƒ

 

 

์•ฑ ๋””์ปดํŒŒ์ผ ํ•˜๊ธฐ

 

์ € ๋™์ž‘ ๊ณผ์ •์—์„œ ์–ด๋–ค ๋ชจ๋“ˆ์ด ์˜ค๊ฐ€๋Š”์ง€ ๋˜ ๊ทธ ๋ชจ๋“ˆ์•ˆ์—๋Š” ์–ด๋–ค ์ˆ˜์‹๋“ค์ด ์žˆ๋Š”์ง€ ํ™•์ธ์„ ์œ„ํ•ด์„œ ์•ฑ ๋””์ปดํŒŒ์ผ๋Ÿฌ์ธ jadx๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค. 

 

https://github.com/skylot/jadx/releases

 

Releases · skylot/jadx

Dex to Java decompiler. Contribute to skylot/jadx development by creating an account on GitHub.

github.com

 

jadx-gui์— Uncrackable1 apk๋ฅผ ๋กœ๋“œ ํ•ด์ค€๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ๋†€๋ž๊ฒŒ๋„ ์‹œ๊ทธ๋‹ˆ์ณ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ์†Œ์Šค, MainActivity ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์†Œ์Šค๋“ค์ด ๋‹ค ๊ณต๊ฐœ๊ฐ€ ๋œ๋‹ค. 

 

 

 

 

์œ ์‹ฌํžˆ ๋ด์•ผํ•  ๋ถ€๋ถ„์€ ๋ฐ”๋กœ ์ด verify ํ•จ์ˆ˜ ๋ถ€๋ถ„

๋ฐ”๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ์˜์—ญ์ธ๋ฐ, EditText์— ์ž…๋ ฅํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ a.a๋ผ๋Š” ๋ฉ”์„œ๋“œ์— ์ธ์ž๋ฅผ ์ค€๋‹ค์Œ ๊ทธ ๋ฆฌํ„ด ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ์„œ ์„ฑ๊ณต๊ณผ ์‹คํŒจ๊ฐ€ ๊ฒฐ์ • ๋œ๋‹ค. 

 

a.a(obj)๋ฅผ ๋”๋ธ” ํด๋ฆญํ•ด์„œ ๋˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋ฅผ ํ™•์ธํ•ด ๋ณธ๋‹ค. 

 

์ด๊ณณ์ด a.a ๋ฉ”์„œ๋“œ์˜ ์‹ค์ฒด์ด๋‹ค. 

AES ๋ฐฉ์‹์œผ๋กœ ์–ด๋–ค ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณตํ˜ธํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ์™€ ๋น„๊ต๋ฅผ ํ•œ๋‹ค์Œ true ํ˜น์€ false๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. 

 

 

๋น„๋ฐ€๋ฒˆํ˜ธ ์šฐํšŒ 1

๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ๋Š” ๋‘ ๊ฐ€์ง€์ธ๋ฐ, ํ•˜๋‚˜๋Š” ๊ฐ„๋‹จํžˆ ๊ฒ€์ฆ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ๊ฐ’์„ ๋ฌด์กฐ๊ฑด true๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

์ด ๋ถ€๋ถ„์˜ return์ธ str.equals...๋ฅผ true๋กœ ๋ฐ”๊พธ์–ด ์ค€๋‹ค๋ฉด ์•„๋ฌด ํ…์ŠคํŠธ๋ฅผ ๋„ฃ์–ด๋„ ์„ฑ๊ณต์„ ์ถœ๋ ฅํ•  ๊ฒƒ์ด๋‹ค. 

 

 

 

[app2.py]

import frida, sys

def on_message(message, data):
	print(message)

    
PACKAGE_NAME = "Uncrackable1"

jscode = """
console.log("[+] Start Script");

Java.perform(function() {
	console.log("[+] Hooking System.exit");
	var aClass = Java.use("sg.vantagepoint.uncrackable1.a");
	aClass.a.implementation = function(str) {
		console.log("[+] a.a ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฐ์ง€");
		return true;
	}
});
"""

process = frida.get_usb_device(1).attach(PACKAGE_NAME)
script = process.create_script(jscode)
script.on('message', on_message)
print('[+] Running Hook')
script.load()
sys.stdin.read()

์ด์ „์— ์‚ฌ์šฉํ•œ ์†Œ์Šค๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•œ ๊ฒƒ์ด๋‹ค. 

"sg.vantagepoint.uncrackable1.a" ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ a ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ด๋ฅผ ํ›„ํ‚นํ•ด์„œ return true๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ์‹œํ‚จ๋‹ค. 

 

 

์ •๋ง๋กœ ์•„๋ฌด๋Ÿฐ ํ…์ŠคํŠธ๋ฅผ ๋„ฃ์–ด๋„ ๋ฌด์กฐ๊ฑด Success๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

๋น„๋ฐ€๋ฒˆํ˜ธ ์šฐํšŒ 2

์ด๋ฒˆ์—๋Š” ์กฐ๊ธˆ ๊ณ ๊ธ‰์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ง์ ‘ ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณตํ™”ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์•„๋‚ด ํ‰๋ฌธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ getํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ๊ตณ์ด ์•ฑ์ด ๋””๋ฒ„๊น…์„ ํ•ด์„œ ํ•จ์ˆ˜ ์กฐ์ž‘์„ ํ†ตํ•ด์„œ ์šฐํšŒํ•˜์ง€ ์•Š๊ณ , ์•Œ์•„๋‚ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์„œ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ด์ ์ด ์žˆ๋‹ค. 

 

 

๊ทธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธํ™”ํ•˜๋Š” ๋ถ€๋ถ„์„ ์šฐ์„  ์ฐพ์•„์•ผ ํ•œ๋‹ค. 

 

์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ sg.vantagepoint.a.a.a ์ด๊ณณ์ด ๊ฐ€์žฅ ์œ ๋ ฅํ–ˆ๋‹ค. 

์ด๋…€์„์ด ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ return ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€์ ธ์™€์„œ ์ฝ˜์†”์ฐฝ์—๋‹ค ์ถœ๋ ฅํ•ด๋ณด๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ์—ˆ๋‹ค. 

 

jscode = """
console.log("[+] Start Script");

Java.perform(function() {
	console.log("[+] Hooking System.exit");
	var aClass = Java.use("sg.vantagepoint.a.a");
	aClass.a.implementation = function(a, b) {
		console.log("[+] ํ˜ธ์ถœ ๊ฐ์ง€!");

		var retVal = this.a(a, b);

		console.log("retVal:", retVal);

		return retVal;
	}
});
"""

์ด๋Ÿฐ์‹์œผ๋กœ ๊ธฐ์กด์˜ ํ•จ์ˆ˜๋ฅผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด๋ฅผ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์€ ๊ฐ€์ง€๊ณ  ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด this.ํ•จ์ˆ˜์ด๋ฆ„()์œผ๋กœ ์จ์ฃผ๋ฉด ๋œ๋‹ค. 

์—ฌ๊ธฐ์„œ ๋‚˜์˜ค๋Š” return value์ธ retVal์„ ์ฝ˜์†”์— ์ถœ๋ ฅ์„ ์‹œ์ผœ๋ณด๋‹ˆ...

 

์™  ์ˆซ์ž๋“ค์ด ๋‚˜์—ด์ด ๋‚˜์˜ค๋Š”๋ฐ ์ด๋Š” ์•„์Šคํ‚ค์ฝ”๋“œ ์ •์ˆ˜๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. 

 

์š”๊ฒƒ์„ String์œผ๋กœ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•ด์ฃผ๊ฒŒ ์ˆ˜์ •

jscode = """
console.log("[+] Start Script");

Java.perform(function() {
	console.log("[+] Hooking System.exit");
	var aClass = Java.use("sg.vantagepoint.a.a");
	aClass.a.implementation = function(a, b) {
		console.log("[+] ํ˜ธ์ถœ ๊ฐ์ง€!");

		var retVal = this.a(a, b);

		console.log("retVal:", retVal);

		var password = "";
		for(var i=0; i<retVal.length; i++){
			password += String.fromCharCode(retVal[i]);
		}
		console.log('Password:', password);

		return retVal;
	}
});
"""

 

 

๋ฐ”๋กœ "I want to belive"๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ

 

 

 

 

[์ „์ฒด ์†Œ์Šค]

import frida, sys

def on_message(message, data):
	print(message)

    
PACKAGE_NAME = "Uncrackable1"

jscode = """
console.log("[+] Start Script");

Java.perform(function() {
	console.log("[+] Hooking System.exit");
	var aClass = Java.use("sg.vantagepoint.a.a");
	aClass.a.implementation = function(a, b) {
		console.log("[+] ํ˜ธ์ถœ ๊ฐ์ง€!");

		var retVal = this.a(a, b);

		console.log("retVal:", retVal);

		var password = "";
		for(var i=0; i<retVal.length; i++){
			password += String.fromCharCode(retVal[i]);
		}
		console.log('Password:', password);

		return retVal;
	}
});
"""

process = frida.get_usb_device(1).attach(PACKAGE_NAME)
script = process.create_script(jscode)
script.on('message', on_message)
print('[+] Running Hook')
script.load()
sys.stdin.read()

 

728x90
๋ฐ˜์‘ํ˜•