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

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

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

 

UnCrackable-Level2๋ฅผ jadx๋กœ ์—ด์–ด๋ณด๋‹ˆ ์š”๋ฒˆ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ  ์–ด๋–ค ๋ฉ”์†Œ๋“œ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ๊ฑด๋‚ด์ฃผ์–ด true, false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค. 

 

 

ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ซ’์•„๊ฐ€๋ฉด ์™  bar๋ผ๋Š” ํ•จ์ˆ˜์—๋‹ค๊ฐ€ ๋˜ ๊ฐ’์„ ๊ฑด๋‚ด์„œ ๋ฆฌํ„ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ณด๋‹ค์‹œํ”ผ bar ํ•จ์ˆ˜๋Š” native๋กœ ์„ ์–ธ์ด ๋˜์–ด์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜์˜ ๋ชธํ†ต์€ ๋ณด์—ฌ์ง€์ง€๊ฐ€ ์•Š๋Š”๋‹ค. 

 

์ž๋ฐ” native ํ‚ค์›Œ๋“œ
์ฐธ๊ณ : https://fors.tistory.com/80

์ž๋ฐ”์˜ native ํ‚ค์›Œ๋“œ๋Š” ์ž๋ฐ”๋กœ ์“ฐ์—ฌ์ง„ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ์ฃผ๋กœ C์–ธ์–ด, C++ ๊ฐ™์€ ์™ธ๋ถ€์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ•ด์ค€๋‹ค. 

์ด ์™ธ๋ถ€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž˜์•Œ๋ ค์ง„ .so๋‚˜ .dll ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ์˜๋ฏธํ•จ 

 

์ฆ‰ bar ํ•จ์ˆ˜์˜ ๊ฒ€์ฆ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์œผ๋ฉด .so ํŒŒ์ผ์ด ์–ด๋””์žˆ๋Š”์ง€ ์ฐพ์•„๋‚ด์•ผํ•œ๋‹ค. 

 

 

MainActivity์˜ ์ฝ”๋“œ๋ฅผ ์ž˜ ์‚ดํŽด๋ณด๋ฉด ์ƒ์œ„์— foo๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. 

์ด foo๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ apk ํŒŒ์ผ ์–ด๋”˜๊ฐ€์— ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. 

 

์ง์ ‘ apk๋ฅผ ์••์ถ•ํ•ด์ œ ํ•˜์—ฌ์„œ lib ํด๋”๋ฅผ ํ™•์ธ ํ•ด๋ดค๋‹ค. 

 

๊ทธ๋Ÿฌ๋”๋‹ˆ ์ •๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ํ•˜๋‚˜๊ฐ€ ๋ฉ๊ทธ๋Ÿฌ๋‹ˆ ์žˆ๋˜ ๊ฒƒ

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋˜ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ida ๊ฐ™์€ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์ค€๋‹ค. 

 

 

ida์— libfoo.so๋ฅผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋žํ•ด์„œ ๋กœ๋“œ ํ›„ Exports ํƒญ์„ ๋ˆŒ๋Ÿฌ์ค€๋‹ค. 

 

 

 

๋ˆŒ๋Ÿฌ์ฃผ๊ฒŒ ๋˜๋‹ˆ CodeCheck_bar๋ผ๋Š” Export๊ฐ€ ๋ณด์ด๋Š”๋ฐ ๋˜ ๋”๋ธ”ํด๋ฆญํ•ด์„œ ๋‚ด์šฉ์„ ํ™•์ธ

 

 

ida๊ฐ€ ์•„์ฃผ ์นœ์ ˆํ•˜๊ฒŒ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ๋™์ž‘๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ F5๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ์ง์ ‘ C์–ธ์–ด ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•จ 

 

* ida free ๋ฒ„์ „์€ x64 ๋ฒ„์ „๋งŒ C์–ธ์–ด ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๋ฏธ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ์—๋Š” x64๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค.

 

 

๋‚˜์—๊ฒŒ ์•„์ฃผ ์ต์ˆ™ํ•œ ์ฝ”๋“œ๋“ค์ด ๋ณด์ธ๋‹ค. 

๊ทผ๋ฐ ๊ฐ€์žฅ ๋ˆˆ์— ๋„์ธ๊ฑด ์ €๊ธฐ strcpy์˜ ์ธ์ž๋กœ Thanks for all the fish ๋ถ€๋ถ„. 

v6์ด๋ผ๋Š” ๋ณ€์ˆ˜์—๋‹ค ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ, ์ €๊ธฐ ๋ฌธ์ž ๋ถ€๋ถ„์ด ๋น„๋ฐ€๋ฒˆํ˜ธ์ผ ํ™•์œจ์ด ๋†’์•˜๋‹ค. 

 

 

 

๋ฌธ์ž์—ด "Thanks for all the fish"๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์•ฑ์—๋‹ค ๋„ฃ๊ณ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด๋‹ˆ ์ •๋ง ๋งž๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค. 

 

์ด๋ฒˆ์—๋Š” ๊ตณ์ด frida์˜ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํˆด๋“ค์„ ์ด์šฉํ•ด์„œ ์ถฉ๋ถ„ํžˆ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋˜ ๋ฌธ์ œ์ด๋‹ค. 

 

 

 

 

๋‹ค๋ฅธ ๋ธ”๋กœ๊ฑฐ๋ถ„์„ ๋ณด๋‹ˆ frida๋กœ libfoo.so๋ฅผ ํ›„ํ‚นํ•ด์„œ ๋™์ž‘ ๊ณผ์ •์„ ์•Œ์•„๋‚ด์„œ ์ง์ ‘ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ด๋Š”๊ฒŒ ๊ฐ€๋Šฅํ–ˆ๋‹ค. 

https://dokhakdubini.tistory.com/361

 

[OWASP-MSTG] Uncrackable level 2 Write-Up

๋˜‘๊ฐ™์ด root detection์„ ์ง„ํ–‰ํ•˜๋„ค์š”. ์ด๊ฑด uncrackable1์˜ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋“ค๊ณ  ์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์ž˜ ์ ‘์†๋˜๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์ง„์งœ ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ์ฃต ๊ทผ๋ฐ verify๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์ „์— MainActivity.

dokhakdubini.tistory.com

 

libfoo.so์˜ strncmp ํ•จ์ˆ˜ ํ›„ํ‚น

 

[crackme2.py]

import frida, sys

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

    
PACKAGE_NAME = "Uncrackable Level 2"

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

Java.perform(function() {

	Interceptor.attach(Module.getExportByName('libfoo.so', 'strncmp'), {

		onEnter: function (args){

			var param1 = args[0];
			var param2 = args[1];
			var param3 = args[2];

			if( Memory.readCString(param1).includes("111") ){
				console.log("[*] Your Input = " + Memory.readCString(param1));
				console.log("[!] Secret Code = " + Memory.readCString(param2));
			}

		},

	});

});
"""

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()

์ฝ”๋“œ๋Š” Interceptor.attach๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ํ›„ํ‚นํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

๊ด€๋ จ ๋ฌธ์„œ:  https://frida.re/docs/javascript-api/#interceptor

 

'libfoo.so'์— 'strncmp'๊ฐ€ onEnter ๋˜์—ˆ์„ ๋•Œ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ ํ•ด์ฃผ์—ˆ๋‹ค. 

 

์ด strncmp์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ธ๋ฐ, && ์•ž์— ๋ณด๋ฉด ์ž…๋ ฅ ์‚ฌ์ด์ฆˆ๋Š” ๋ฌด์กฐ๊ฑด 23๊ฐœ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ ํ˜€์žˆ๋‹ค. 

 

ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์ƒ AND ์กฐ๊ฑด๋ฌธ์ด ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด,

๋’ค์˜ ์กฐ๊ฑด๋“ค์„ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•ด๋ฒ„๋ฆฌ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ ์‚ฌ์ด์ฆˆ๊ฐ€ 23๊ฐœ๊ฐ€ ๋˜์–ด์•ผ์ง€ strncmp ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ์ด ๋œ๋‹ค. 

 

์•ฑ์—์„œ 1์„ 23๊ฐœ ์ ์–ด์ค€ ๋‹ค์Œ ๋‹ค์‹œ ์ฝ˜์†”์ฐฝ์„ ํ™•์ธํ•ด๋ณด๋ฉด

 

strncmp์— param2 ์ฆ‰ ๋‘๋ฒˆ์งธ ์ธ์ž์— ๊ฑด๋‚ด์ค€ ๊ฐ’์ด ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค. 

 

728x90
๋ฐ˜์‘ํ˜•