-
[์๋๋ก์ด๋ ๋ฆฌ๋ฒ์ฑ] ์ฝ๋์์ง (CodeEngn) Mobile App 01 ๋ฒSECURITY/Android Reversing 2022. 2. 9. 16:15
CodeEngn ์ Moblie App ๊ด๋ จ ๋ฌธ์ ๊ฐ ์์ด์, ์ด๋ฅผ ํ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.๋ค์ ๋งํฌ์์ ๋ฌธ์ ํ์ผ์ ๋ค์ด๋ฐ์ผ๋ฉด ๋ฉ๋๋ค. (https://ch.codeengn.com/)
์์ถ์ ํ ๋๋ ๋ฌธ์ ์ ์จ์๋ ๋๋ก, File Password (codeengn) ๋ฅผ ์ ๋ ฅํด์ผ ํ๋ค.
์์ถ์ ํ๋ฉด apk ํ์ผ์ด ํ๋ ๋์จ๋ค.
๋จผ์ ์ด apk ๋ฅผ emulator ์ ์ค์นํด๋ณด์์ผ๊ฒ ๋ค.
์ฐธ๊ณ ๋ก, emulator ๋ฅผ shell ์์ ์คํ์ํฌ ์ ์๋๋ฐ, ๋จผ์ emulator ํ๋ก๊ทธ๋จ์ ์ฐพ์์ผ ํ๋ค.
๋์ ๊ฒฝ์ฐ \AppData\Local\Android\Sdk\emulator ์ ์์๊ณ , ๋ค์ ์น๊ตฌ๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค.
ํด๋น ํด๋์ ๊ฒฝ๋ก์์ ๋ค์์ ๋ช ๋ น์ด๋ก emulator ๋ฆฌ์คํธ๋ฅผ ๋ณด๊ณ ํน์ emulator ๋ฅผ ์คํ์ํฌ ์ ์๋ค.
$ emulator -list-avds $ emulator -avd Nexus_5X_API_28
์ด์ ์คํ๋ ์๋ฎฌ๋ ์ดํฐ์ ์ apk ๋ฅผ ๊น์๋ณด์.
apk ๋ ๋๋๊ทธ-๋๋กญ์ผ๋ก ์๋ฎฌ๋ ์ดํฐ์ ๊น ์ ์๋๋ฐ, ์ด apk ๋ ์ค๋ฅ๋ฅผ ๋ฟ๋๋ค.
์.. ์ผ๋จ jadx ๋ก apk ๋ฅผ ๋์ปดํ์ผ ํด๋ณด์๋ค.
Security ๋ก ์ด๋ค string ์ ๋ณตํธํํ๋๋ฐ, ์ด๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
apk ๋ง ์คํ์ํค๋ฉด ์ด๋ฅผ ๋ฐ๋ก ๋ณผ ์ ์์ํ ๋ฐ, Security ์์ค๋ฅผ ๋ณด๊ณ ๋ณตํธํ ํด๋ด์ผ๊ฒ ๋ค.
์ญ ๋ณด๋ key ๊ฐ 128bit ์ด๊ณ , 16 byte ๋ฅผ ์ํ padding ์ ์ฃผ๊ณ iv ๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ ๋ณด์ํ๋
AES-128 ๋ก ์๋ณตํธํ๋ฅผ ํ๋ ๊ฒ ๊ฐ๋ค. (mode ๋ CBC?)
python ์์ Crypto ๋ก AES-128 ์๋ณตํธํ๋ฅผ ์ ์ฉํด ๋ณด์๋๋ฐ, ๊ฒฐ๊ณผ๊ฐ ์ด์ํ๊ฒ ๋์ค๋ ๊ฑธ๋ก ๋ด์๋ KISA ๋ ์ข ๋ค๋ฅธ ๋ฐฉ์์ธ๊ฐ๋ณด๋ค.
๊ทธ๋์ KISA ์์ ์ ๊ณตํ๋ ์ํธ ์๊ณ ๋ฆฌ์ฆ๋ ๋ฏ์ด๋ณด์๋ค.
KISA ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ค๋ฅผ ์ ๊ณตํด์, JAVA ์์ค๋ฅผ ์ด์ฉํด์ ํด๋น ์ํธ๋ฌธ์ ๋ณตํธํ๋ฅผ ์ํํ๋๋ก ํ๊ฒ ๋ค.
์์ค ํ์ผ์ JAVA ์ฝ๋๋ก CBC ๋ด์ฉ์ด ์๋ค.
// KISA_SEED_CBC.java public static byte[] SEED_CBC_Encrypt( byte[] pbszUserKey, byte[] pbszIV, byte[] message, int message_offset, int message_length ) { ... } public static byte[] SEED_CBC_Decrypt( byte[] pbszUserKey, byte[] pbszIV, byte[] message, int message_offset, int message_length ) { ... }
์ด ๋ ํจ์๋ฅผ ์ฌ์ฉํด์ ๋ณตํธํ๋ฅผ ํด๋ณผ ๊ฒ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด apk ๋ฅผ ๋์ปดํ์ผํ ์ฝ๋์์ ์๋ณตํธํ๋ฅผ KISA_SEED_CBC.java ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ ์ ํ ๋ฐ๊ฟ์ฃผ์๋ค.
import java.math.BigInteger; public class SimpleAppSecurity { public static final byte[] key = {51, -46, 79, -113, 8, 34, 121, -15, -23, -13, -108, 55, 10, -44, 5, -119}; public static final byte[] iv = {38, -115, 102, -89, 53, -88, 26, -127, 95, -70, -39, -6, 54, 25, 37, 19}; public static String EncryptStr(String encText) { String encText2; if (encText == null || encText.equals("")) { encText2 = ""; } else { byte[] plainText = encText.trim().getBytes(); byte[] cipherText = KISA_SEED_CBC.SEED_CBC_Encrypt(key, iv, plainText, 0, plainText.length); encText2 = new String(new BigInteger(cipherText).toString(16)); } return encText2.trim(); } public static String DecryptStr(String decText) { if (decText == null || decText.equals("")) { return ""; } byte[] cipherText = new BigInteger(decText.trim(), 16).toByteArray(); byte[] plainText = KISA_SEED_CBC.SEED_CBC_Decrypt(key, iv, cipherText, 0, cipherText.length); return new String(plainText).trim(); } public static void main(String[] args) { // DecryptStr("-1aaa755a1e60915baff1d4cb64cb221a0000000000000000000000000000"); String result = DecryptStr("-1aaa755a1e60915baff1d4cb64cb221a"); System.out.println(result); } }
๊ฒฐ๊ณผ๋ก flag ๋ฅผ ํ์ธํ ์ ์์๋ค.
์ฃผ์ํ ์ ์ ๋ค์ padding ์ธ 000...000 ์ ๋นผ๊ณ ๋ณตํธํ๋ฅผ ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
apk ๋ฅผ ๋์ปดํ์ผํด์ ์์ค ๋ด์ฉ์ ๋ณด๊ณ ์ํธ๋ฌธ์ ํผ ๊ฒ์ ๋ง์ผ๋
Android ๋ฌธ์ ๋ฅผ Crypto + Code ๋๋์ผ๋ก ํ์ด๋ฒ๋ ค์ ์ ์์ ์ดํด๋ณด๋ ค๊ณ apk ๋ฅผ ๋ค์ ๋ฏ์ด๋ณด์๋ค.
๊ทธ๋ฌ๋ค ํ์ผ๋ค์ ๋ณด๋ฉด class ๊ฐ์ด ํ์ผ ๋ช ์ด ์ผ๋ฐ์ ์ธ apk ๋ ๋ค๋ฅธ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.
์ข: L01 apk / ์ฐ: L02 apk
- AndroidManIfests.xml -> AndroidManifest.xml
- class.dex -> classes.dex
- resource.arsc -> resources.arsc
์ด๋ ๊ฒ ๋ฐ๊ฟ์ฃผ๊ณ ์์ถ์ํจ ํ ํ์ฅ์๋ฅผ apk ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
์ด๊ฑธ ์๋ฎฌ๋ ์ดํฐ์ ๊น์์ฃผ๋ฉด ๋๋๋ฐ ... ๊ทธ๋๋ ์ด๋ฆฌ์ง ์์์ ์ผ๋จ์ ๋ณด๋ฅํ๊ณ ์๋ค.
'SECURITY > Android Reversing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ