[๐Ÿฅ‰ Bronze 2] 3์ค‘์œผ๋กœ ๋ง‰์•„๋‘” ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„ํŠผ, ๊ทธ๋ž˜๋„ ์ •์ ๋ถ„์„์œผ๋กœ ๋šซ๋Š”๋‹ค โ€” DreamHack [CodeEngn] MobileApp L02 ํ’€์ด

2026-07-22ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 2] 3์ค‘์œผ๋กœ ๋ง‰์•„๋‘” ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„ํŠผ, ๊ทธ๋ž˜๋„ ์ •์ ๋ถ„์„์œผ๋กœ ๋šซ๋Š”๋‹ค โ€” DreamHack [CodeEngn] MobileApp L02 ํ’€์ด

L01๊ณผ ๊ฐ™์€ SEED-128 CBC + Java BigInteger ๋ถ€ํ˜ธ ์ธ์ฝ”๋”ฉ ๊ตฌ์กฐ์ง€๋งŒ, ์ด๋ฒˆ์—” ์œ ํšจ ๋ธ”๋ก์ด 2๊ฐœ๋ผ CBC ์ฒด์ด๋‹๊นŒ์ง€ ํ’€์–ด์•ผ ํ•œ๋‹ค. onCreate()์˜ ์‹คํ–‰ ์กฐ๊ฑด์€ ์ฐธ์กฐ๋น„๊ต(==)ยทํ•˜๋“œ์ฝ”๋”ฉ ์ƒ์ˆ˜ยท ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณผ๊ฑฐ ์‹œ๊ฐ 3์ค‘์œผ๋กœ ๋ง‰ํ˜€ ์žˆ์–ด, ์•ฑ์„ ์‹คํ–‰ํ•ด์„œ๋Š” ์ ˆ๋Œ€ ๋‹ต์ด ์•ˆ ๋‚˜์˜ค๊ฒŒ ์„ค๊ณ„๋๋‹ค.

๋ฌธ์ œ: DreamHack โ€” [CodeEngn] MobileApp L02 ๋ถ„๋ฅ˜: Reversing / Mobile (Android) ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 2 FLAG: the key is november rain

๊ฐ™์€ ์‹œ๋ฆฌ์ฆˆ์˜ L01์„ ํ’€๊ณ  ๋‚˜์„œ ์ด์–ด์„œ ๋ฐ›์€ ๋ฌธ์ œ๋‹ค. ๊ตฌ์กฐ๋Š” ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค โ€” SEED-128 CBC๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ๋ณตํ˜ธํ•ด ๊ทธ ๊ฐ’์ด "ํ‚ค๊ฐ’"์ด ๋˜๋Š” ํ˜•ํƒœ. ๋‹ค๋งŒ ์ด๋ฒˆ์—” ๋‘ ๊ฐ€์ง€๊ฐ€ ๋‹ฌ๋ž๋‹ค. ์œ ํšจํ•œ SEED ๋ธ”๋ก์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘˜์ด๋ผ CBC ์ฒด์ด๋‹์„ ์‹ค์ œ๋กœ ์ด์–ด์•ผ ํ–ˆ๊ณ , ์•ฑ์ด ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ๋‹ต์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋„๋ก ์กฐ๊ฑด์„ ์„ธ ๊ฒน์œผ๋กœ ๋ง‰์•„๋’€๋‹ค.


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…[CodeEngn] MobileApp L02
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 2
๋ถ„๋ฅ˜Reversing / Mobile
์ œ๊ณต ํŒŒ์ผSmartApp L02.apk
์ŠคํƒAndroid (Dalvik), ๋„ค์ดํ‹ฐ๋ธŒ libKISACrypto.so
ํ•ต์‹ฌ ๊ธฐ๋ฒ•SEED-128 2๋ธ”๋ก CBC ๋ณตํ˜ธ + BigInteger ๋ถ€ํ˜ธ ์ธ์ฝ”๋”ฉ + ์‹คํ–‰ ์ž์ฒด๊ฐ€ ๋ง‰ํžŒ UI


๐Ÿ”ฌ ์ฝ”๋“œ ์ •์ฐฐ

APK ์•ˆ์„ ๋จผ์ € ๋ณธ๋‹ค.

file "SmartApp L02.apk" && unzip -l "SmartApp L02.apk" | grep -E "dex|\.so"

APK ๋‚ด๋ถ€ โ€” classes.dex์™€ ๋„ค์ดํ‹ฐ๋ธŒ libKISACrypto.so, dex ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์•ฑ ์•ˆ์˜ ๋‚ ์งœ ์ƒ์ˆ˜์™€ ๊ฑฐ์˜ ๊ฒน์นœ๋‹ค
APK ๋‚ด๋ถ€ โ€” classes.dex์™€ ๋„ค์ดํ‹ฐ๋ธŒ libKISACrypto.so, dex ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์•ฑ ์•ˆ์˜ ๋‚ ์งœ ์ƒ์ˆ˜์™€ ๊ฑฐ์˜ ๊ฒน์นœ๋‹ค

classes.dex์˜ ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ 2013-11-02 12:42 โ€” ๋’ค์—์„œ ๋ณผ ์กฐ๊ฑด๋ฌธ์— ๋ฐ•ํ˜€ ์žˆ๋Š” "2013-11-02-12:35:03"๊ณผ 7๋ถ„ ์ฐจ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ทธ ์ƒ์ˆ˜๋ฅผ ์•ฑ์„ ๋นŒ๋“œํ•˜๋˜ ๊ทธ ์‹œ์  ๊ทผ์ฒ˜๋กœ ๋ฐ•์•„๋‘” ํ”์ ์œผ๋กœ ๋ณด์ธ๋‹ค.

jadx๋กœ ๋””์ปดํŒŒ์ผํ•ด์„œ Security ํด๋ž˜์Šค๋ถ€ํ„ฐ ๋ณธ๋‹ค. L01๊ณผ ์™„์ „ํžˆ ๊ฐ™์€ ๊ตฌ์กฐ๋‹ค.

jadx -q -r -d jadx_out "SmartApp L02.apk"

jadx ๋””์ปดํŒŒ์ผ โ€” Security ํด๋ž˜์Šค์˜ key/iv ์ •์ ๋ฐฐ์—ด๊ณผ DecryptStr
jadx ๋””์ปดํŒŒ์ผ โ€” Security ํด๋ž˜์Šค์˜ key/iv ์ •์ ๋ฐฐ์—ด๊ณผ DecryptStr

DecryptStr์€ L01๊ณผ ํ•œ ๊ธ€์ž๋„ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. hex ๋ฌธ์ž์—ด์„ BigInteger๋กœ ๋ฐ”์ดํŠธ๋กœ ๋ฐ”๊พผ ๋’ค SEED๋กœ ๋ณตํ˜ธํ•œ๋‹ค. System.loadLibrary("KISACrypto")๊ฐ€ ๋ˆˆ์— ๋„์ง€๋งŒ L01์—์„œ ์ด๋ฏธ ํ™•์ธํ–ˆ๋“ฏ ํ‘œ์ค€ SEED-128์ด๋ผ .so๋ฅผ ๋ฆฌ๋ฒ„์‹ฑํ•  ํ•„์š”๋Š” ์—†๋‹ค.

๊ทธ๋Ÿผ ์ด ๊ฐ’์„ ์–ด๋””์„œ ํ˜ธ์ถœํ•˜๋Š”์ง€ MainActivity๋ฅผ ๋ณธ๋‹ค.

cat jadx_out/sources/com/namdaehyeon/findkey2/MainActivity.java

jadx ๋””์ปดํŒŒ์ผ โ€” onCreate์˜ ์‹คํ–‰ ์กฐ๊ฑด์ด ์„ธ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ ˆ๋Œ€ ๋งŒ์กฑ๋˜์ง€ ์•Š๋Š”๋‹ค
jadx ๋””์ปดํŒŒ์ผ โ€” onCreate์˜ ์‹คํ–‰ ์กฐ๊ฑด์ด ์„ธ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ ˆ๋Œ€ ๋งŒ์กฑ๋˜์ง€ ์•Š๋Š”๋‹ค

์—ฌ๊ธฐ์„œ L01๊ณผ ๊ฐˆ๋ฆฐ๋‹ค. L01์€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ณง๋ฐ”๋กœ DecryptStr ๊ฒฐ๊ณผ๊ฐ€ ๋Œ€ํ™”์ƒ์ž์— ๋œจ๋Š”๋ฐ, L02๋Š” onCreate() ์•ˆ์— ์กฐ๊ฑด๋ฌธ์ด ํ•˜๋‚˜ ๋” ์žˆ๋‹ค.

if (makeDate() == "2013-11-02-12:35:03" && Volume() == 53) {
    this.aView.setText(keyString());
}

์ด ํ•œ ์ค„์ด ์„ธ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ ˆ๋Œ€ ์ฐธ์ด ๋  ์ˆ˜ ์—†๋‹ค.

  1. ==๋Š” Java์—์„œ String ๋‚ด์šฉ ๋น„๊ต๊ฐ€ ์•„๋‹ˆ๋ผ ์ฐธ์กฐ ๋น„๊ต๋‹ค. makeDate()๊ฐ€ ๋งค๋ฒˆ SimpleDateFormat.format()์œผ๋กœ ์ƒˆ๋กœ ๋งŒ๋“  ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋ฏ€๋กœ, ๋‚ด์šฉ์ด ์šฐ์—ฐํžˆ ๋˜‘๊ฐ™์•„๋„ ==๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ผ ๊ฑฐ์ง“์ด๋‹ค. .equals()๋ฅผ ์ผ์–ด์•ผ ํ•  ์ž๋ฆฌ๋‹ค.
  2. ์„ค๋ น ==๊ฐ€ .equals()์˜€๋”๋ผ๋„ makeDate()๋Š” ํ˜„์žฌ ์‹œ๊ฐ์„ ๋‹ด์œผ๋ฏ€๋กœ "2013-11-02-12:35:03"๊ณผ ๊ฐ™์•„์งˆ ์ˆœ๊ฐ„์€ ์‹คํ–‰ ์ค‘ ๋‹จ 1์ดˆ, ๊ทธ๊ฒƒ๋„ ๊ธฐ๊ธฐ ์‹œ๊ฐ์„ ๊ทธ๋ ‡๊ฒŒ ๋งž์ถฐ์•ผ๋งŒ ์˜จ๋‹ค.
  3. Volume()์€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ์ˆ˜ 33์„ ๋ฆฌํ„ดํ•œ๋‹ค. ์กฐ๊ฑด์€ Volume() == 53์ด๋‹ˆ ์ด ๋น„๊ต๋Š” ์ฝ”๋“œ๊ฐ€ ๋„๋Š” ํ•œ ํ•ญ์ƒ ๊ฑฐ์ง“์ด๋‹ค.

์…‹ ์ค‘ ํ•˜๋‚˜๋งŒ ๊ฑธ๋ ค๋„ ๋‹ต์€ ์•ˆ ๋œจ๋Š”๋ฐ ์„ธ ๊ฐœ๊ฐ€ ๋™์‹œ์— ๋ง‰ํ˜€ ์žˆ๋‹ค. ์ฆ‰ ์ด ์•ฑ์€ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•ด์„œ๋Š” ์ ˆ๋Œ€ ๋‹ต์„ ๋ณผ ์ˆ˜ ์—†๊ฒŒ ์„ค๊ณ„๋๋‹ค. keyString()์ด ๋„˜๊ธฐ๋Š” ๋ฆฌํ„ฐ๋Ÿด์„ ์ง์ ‘ ๋ณตํ˜ธํ•˜๋Š” ๊ฒƒ ๋ง๊ณ ๋Š” ๊ธธ์ด ์—†๋‹ค.

public String keyString() {
    return Security.DecryptStr("-1c776f3a2fa678cae27879e87a74553c61009eefb037bbe2abdbd5e4314407e60000000000000000");
}

๐Ÿ’ฃ ํ•ต์‹ฌ โ€” BigInteger ์ธ์ฝ”๋”ฉ, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—” ๋ธ”๋ก์ด ๋‘ ๊ฐœ

L01์—์„œ ๋‹ค๋ฃฌ ํ•จ์ • ๋‘ ๊ฐ€์ง€(BigInteger 2์˜ ๋ณด์ˆ˜ ์ธ์ฝ”๋”ฉ, keyโ‰ iv)๋Š” ์—ฌ๊ธฐ์„œ๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค. Security ์ •์ ๋ฐฐ์—ด์„ ๋ถ€ํ˜ธ ์—†๋Š” ๋ฐ”์ดํŠธ๋กœ ๋‹ค์‹œ ์ฝ์œผ๋ฉด:

key = 33d24f8f082279f1e9f394370ad40589
iv  = 268d66a735a81a815fbad9fa36192513

keyString()์˜ ๋ฆฌํ„ฐ๋Ÿด์€ -๋กœ ์‹œ์ž‘ํ•˜๋Š” ์Œ์ˆ˜ hex๋‹ค. Java new BigInteger(hex, 16).toByteArray()๋Š” ์ด ๊ฐ’์„ ์ตœ์†Œ ๊ธธ์ด์˜ ๋ถ€ํ˜ธ ์žˆ๋Š” 2์˜ ๋ณด์ˆ˜ big-endian์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š”๋ฐ, ์ด๋ฒˆ์—” ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ 40๋ฐ”์ดํŠธ๋กœ, L01(30๋ฐ”์ดํŠธ, ์œ ํšจ ๋ธ”๋ก 1๊ฐœ)๋ณด๋‹ค ๊ธธ๋‹ค. 16๋ฐ”์ดํŠธ์”ฉ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ์•ž์˜ 32๋ฐ”์ดํŠธ(2๊ฐœ ๋ธ”๋ก)๊ฐ€ ์œ ํšจ SEED ๋ฐ์ดํ„ฐ๊ณ , ๋‚˜๋จธ์ง€ 8๋ฐ”์ดํŠธ๋Š” ์›๋ณธ ๋ฆฌํ„ฐ๋Ÿด ๋์˜ 0000000000000000์ด ๊ทธ๋Œ€๋กœ ๋„˜์–ด์˜จ zero-fill ์ž”์žฌ๋‹ค โ€” 16๋ฐ”์ดํŠธ๋ฅผ ๋ชป ์ฑ„์›Œ์„œ ๋ฒ„๋ ค์ง„๋‹ค.

๋ธ”๋ก์ด ๋‘˜์ด๋ผ๋Š” ๊ฒŒ L01๊ณผ์˜ ์‹ค์งˆ์ ์ธ ์ฐจ์ด๋‹ค. CBC ๋ณตํ˜ธ๋Š” ์ด๋ ‡๊ฒŒ ์ฒด์ด๋‹๋œ๋‹ค.

2๋ธ”๋ก CBC ์ฒด์ด๋‹ โ€” block1์€ IV์™€, block2๋Š” block1์˜ ์•”ํ˜ธ๋ฌธ(C1)๊ณผ XORํ•œ๋‹ค
2๋ธ”๋ก CBC ์ฒด์ด๋‹ โ€” block1์€ IV์™€, block2๋Š” block1์˜ ์•”ํ˜ธ๋ฌธ(C1)๊ณผ XORํ•œ๋‹ค

P1 = D(C1) โŠ• IV๋Š” L01๊ณผ ๊ฐ™์€ ๊ณ„์‚ฐ์ด์ง€๋งŒ, P2 = D(C2) โŠ• C1์—์„œ C1(์ฒซ ๋ธ”๋ก ์•”ํ˜ธ๋ฌธ)์ด ๋‹ค์‹œ XOR ํ‚ค๋กœ ์“ฐ์ธ๋‹ค. ์ด๊ฑธ ๋†“์น˜๊ณ  ๋‘ ๋ธ”๋ก์„ ๊ฐ๊ฐ IV๋กœ๋งŒ ๋ณตํ˜ธํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์€ ๊นจ์ง„ ๋ฐ”์ดํŠธ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋‹คํ–‰ํžˆ openssl seed-cbc๋Š” ์—ฌ๋Ÿฌ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ์— ๋„˜๊ธฐ๋ฉด ์ด ์ฒด์ด๋‹์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค โ€” ์ง์ ‘ XOR์„ ์งค ํ•„์š” ์—†์ด 32๋ฐ”์ดํŠธ๋ฅผ ํ†ต์งธ๋กœ ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค.



๐Ÿš€ Full Exploit

smali์—์„œ keyยทivยท์•”ํ˜ธ๋ฌธ ๋ฆฌํ„ฐ๋Ÿด์„ ์ง์ ‘ ํŒŒ์‹ฑํ•ด ์ž์ฒด์™„๊ฒฐ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. L01์˜ solve.py์™€ ๋ผˆ๋Œ€๋Š” ๊ฐ™๊ณ , ๋ธ”๋ก ์ˆ˜๋ฅผ ๋ฆฌํ„ฐ๋Ÿด ๊ธธ์ด์—์„œ ๊ณ„์‚ฐํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋‹ค๋ฅด๋‹ค.

import re
import subprocess
from pathlib import Path
 
BASE = Path(__file__).resolve().parent / "decoded" / "smali" / "com" / "namdaehyeon" / "findkey2"
SEC = BASE / "Security.smali"
MAIN = BASE / "MainActivity.smali"
 
 
def parse_smali_byte_array(text, label):
    m = re.search(r":%s\s*\n\s*\.array-data 1\n(.*?)\.end array-data" % label, text, re.S)
    vals = re.findall(r"(-?0x[0-9a-fA-F]+)t", m.group(1))
    return bytes(int(v, 16) & 0xFF for v in vals)
 
 
def java_biginteger_hex_to_bytes(hexstr):
    sign = -1 if hexstr.startswith('-') else 1
    value = sign * int(hexstr.lstrip('-'), 16)
    n = 1
    while True:
        try:
            return value.to_bytes(n, 'big', signed=True)
        except OverflowError:
            n += 1
 
 
def pkcs7_strip(b):
    pad = b[-1]
    return b[:-pad] if 1 <= pad <= 16 and b[-pad:] == bytes([pad]) * pad else b
 
 
sec_text = SEC.read_text()
key = parse_smali_byte_array(sec_text, "array_0")
iv = parse_smali_byte_array(sec_text, "array_1")
print(f"[*] key = {key.hex()}")
print(f"[*] iv  = {iv.hex()}")
 
ct_hex = re.search(r'const-string v1, "(-?[0-9a-f]+)"', MAIN.read_text()).group(1)
ct_bytes = java_biginteger_hex_to_bytes(ct_hex)
print(f"[*] cipherText (BigInteger.toByteArray) = {ct_bytes.hex()} ({len(ct_bytes)} bytes)")
 
n_blocks = len(ct_bytes) // 16
block = ct_bytes[:n_blocks * 16]
print(f"[*] {n_blocks} valid SEED block(s), trailing {len(ct_bytes) - len(block)} bytes are zero-fill artifact")
 
out = subprocess.run(
    ["openssl", "enc", "-d", "-seed-cbc", "-K", key.hex(), "-iv", iv.hex(),
     "-nopad", "-provider", "legacy", "-provider", "default"],
    input=block, capture_output=True)
 
pt = pkcs7_strip(out.stdout)
print(f"[+] decrypted   = {pt.decode()!r}")
print(f"[+] flag submit = {pt.decode().lower()!r}")

solve.py ์‹คํ–‰ โ€” ๋‘ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ์— ๋„˜๊ธด openssl seed-cbc๊ฐ€ ์ฒด์ด๋‹๊นŒ์ง€ ์ฒ˜๋ฆฌํ•ด ๋ฌธ์žฅ ์ „์ฒด๋ฅผ ๋ณต์›
solve.py ์‹คํ–‰ โ€” ๋‘ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ์— ๋„˜๊ธด openssl seed-cbc๊ฐ€ ์ฒด์ด๋‹๊นŒ์ง€ ์ฒ˜๋ฆฌํ•ด ๋ฌธ์žฅ ์ „์ฒด๋ฅผ ๋ณต์›

๋ณตํ˜ธ๋œ ๋ฌธ์žฅ์€ The Key is November Rain. ์ด๊ฒŒ ์•ฑ์ด (์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด ๋’ค์— ์ˆจ๊ฒจ์„œ) ๋ณด์—ฌ์ฃผ๋ ค๋˜ ๊ฐ’์ด๋‹ค.

โ–ถ๐Ÿ› ์ œ์ถœ ์‚ฝ์งˆ โ€” ๋ณตํ˜ธ๋œ ๋ฌธ์žฅ ๊ทธ๋Œ€๋กœ๋Š” ์˜ค๋‹ต

๋ณตํ˜ธ๋œ ๋ฌธ์ž์—ด์„ ๊ทธ๋Œ€๋กœ ์ œ์ถœํ–ˆ๋‹ค๊ฐ€ ์˜ค๋‹ต ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ›์•˜๋‹ค. ๋ฌธ์žฅ์—์„œ "ํ‚ค ์ž์ฒด"๋งŒ ๋ฝ‘์•„ November Rain์œผ๋กœ๋„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ด ์—ญ์‹œ ์˜ค๋‹ต์ด์—ˆ๋‹ค. ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พผ ์ „์ฒด ๋ฌธ์žฅ the key is november rain์„ ๋„ฃ์œผ๋‹ˆ ์ •๋‹ต์œผ๋กœ ์ฒ˜๋ฆฌ๋๋‹ค.

$ dreamhack.py wg 377 --flag "The Key is November Rain"
RESULT: ์˜ค๋‹ต/์‹คํŒจ
 
$ dreamhack.py wg 377 --flag "November Rain"
RESULT: ์˜ค๋‹ต/์‹คํŒจ
 
$ dreamhack.py wg 377 --flag "the key is november rain"
RESULT: ์ •๋‹ต! ํ•ด๊ฒฐ ์ฒ˜๋ฆฌ๋จ

๋ณตํ˜ธ ๋กœ์ง ์ž์ฒด(ํ‚คยทIVยท๋ธ”๋ก ์ฒด์ด๋‹)๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งž์•˜๋‹ค๋Š” ๋œป์ด๋ผ, ๋ง‰ํžŒ ์ง€์ ์€ ์•”ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ œ์ถœ ๋ฌธ์ž์—ด์˜ ํ˜•ํƒœ์˜€๋‹ค. ์ •ํ™•ํžˆ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๋•Œ๋ฌธ์ธ์ง€ ๋‹ค๋ฅธ ์ •๊ทœํ™” ๊ทœ์น™์ด ์žˆ๋Š”์ง€๋Š” ํ”Œ๋žซํผ ๋‚ด๋ถ€ ๋กœ์ง์ด๋ผ ๋‹จ์ •ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์‹ค์ œ๋กœ ํ†ต๊ณผํ•œ ๊ฑด ์†Œ๋ฌธ์ž ๋ฒ„์ „์ด์—ˆ๋‹ค.



๐Ÿ“ ๊ฒฐ๋ก 

ํด๋ผ์ด์–ธํŠธ ๋กœ์ง์ด "์‹คํ–‰ ๋ชป ํ•˜๊ฒŒ" ๋ง‰์•„๋†”๋„ ์ •์ ๋ถ„์„ ์•ž์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. == ์ฐธ์กฐ๋น„๊ต, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ์ˆ˜, ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณผ๊ฑฐ ์‹œ๊ฐ โ€” ์ด ์•ฑ์€ ์„ธ ๊ฐ€์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ UI ๊ฒฝ๋กœ๋ฅผ ๋ด‰์ธํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ด‰์ธ์€ ์ „๋ถ€ "๋Ÿฐํƒ€์ž„์— ๊ทธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”๊ฐ€"์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ, ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์ฝ์–ด์„œ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ์šฐ๋ฆฌ ์†์œผ๋กœ ์žฌํ˜„ํ•˜๋ฉด ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„๋‹ค. ์•ฑ์„ ์‹ค์ œ๋กœ ์„ค์น˜ํ•ด์„œ ๋ˆŒ๋Ÿฌ๋ณผ ํ•„์š” ์ž์ฒด๊ฐ€ ์—†์—ˆ๋‹ค.

CBC๋Š” ๋ธ”๋ก์ด ๋Š˜์–ด๋‚˜๋ฉด ์ฒด์ด๋‹๋„ ๊ฐ™์ด ๋Š˜์–ด๋‚œ๋‹ค. L01์ฒ˜๋Ÿผ ์œ ํšจ ๋ธ”๋ก์ด ํ•˜๋‚˜๋ฟ์ด๋ฉด D(C) โŠ• IV ํ•œ ๋ฒˆ์œผ๋กœ ๋๋‚˜์ง€๋งŒ, ๋ธ”๋ก์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก๋ถ€ํ„ฐ๋Š” ์ด์ „ ๋ธ”๋ก์˜ ์•”ํ˜ธ๋ฌธ์ด XOR ํ‚ค๊ฐ€ ๋œ๋‹ค. ์ด ์‚ฌ์‹ค์„ ๋†“์น˜๊ณ  ๋ชจ๋“  ๋ธ”๋ก์„ IV๋กœ๋งŒ ๋ณตํ˜ธํ•˜๋ฉด ์ฒซ ๋ธ”๋ก๋งŒ ๋งž๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ „๋ถ€ ๊นจ์ง„๋‹ค.

์ œ์ถœ ํ˜•์‹์€ ๋ณตํ˜ธ ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์•”ํ˜ธ๋ฅผ ์ •ํ™•ํžˆ ํ’€์—ˆ๋‹ค๊ณ  ๋์ด ์•„๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์žยท๊ณต๋ฐฑยท๋ฌธ์žฅ ์ „์ฒด๋ƒ ์ผ๋ถ€๋ƒ์ฒ˜๋Ÿผ, ๋ณตํ˜ธ๋œ "๊ฐ’"๊ณผ ํ”Œ๋žซํผ์ด ๊ธฐ๋Œ€ํ•˜๋Š” "์ œ์ถœ ๋ฌธ์ž์—ด"์ด ์ •ํ™•ํžˆ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ ํ™•์ธํ–ˆ๋‹ค.

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 2] ๋ฒ„ํŠผ 8.9์–ต ๋ฒˆ ๋Œ€์‹  APK ์† SEED-128 CBC ๋ฅผ ์ง์ ‘ ํ‘ผ๋‹ค โ€” DreamHack [CodeEngn] MobileApp L03 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] ๋ฒ„ํŠผ 8.9์–ต ๋ฒˆ ๋Œ€์‹  APK ์† SEED-128 CBC ๋ฅผ ์ง์ ‘ ํ‘ผ๋‹ค โ€” DreamHack [CodeEngn] MobileApp L03 ํ’€์ด

SmartApp L03.apk ๋Š” ๋ฒ„ํŠผ์„ randomRange(44444) ๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ํ‚ค๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค. ํ‰๊ท  8.9์–ต ๋ฒˆ์ด๋ผ UI ๋กœ๋Š” ์ ˆ๋Œ€ ๋ชป ๋ณธ๋‹ค. jadx ๋กœ ๋œฏ์–ด๋ณด๋ฉด ๊ทธ ๊ฐ’์€ ์ž…๋ ฅ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ Security.DecryptStr() ์ด ํ•˜๋“œ์ฝ”๋”ฉ hex ๋ฅผ SEED-128 CBC ๋กœ ๋ณตํ˜ธํ•œ ๊ฒฐ๊ณผ์˜€๊ณ , key ์™€ IV ๋Š” dex ์˜ fill-array-data ํŽ˜์ด๋กœ๋“œ์— ์ƒ์ˆ˜๋กœ ๋ฐ•ํ˜€ ์žˆ๋‹ค. apktool ์—†์ด classes.dex ์—์„œ ์ƒ์ˆ˜๋ฅผ ์ง์ ‘ ๊ธ์–ด๋‚ด openssl seed-cbc ๋กœ ๋ณตํ˜ธํ•˜๋ฉด ํ‚ค๊ฐ’ CodeEngn_4_Ever ๊ฐ€ ๋‚˜์˜จ๋‹ค.
#dreamhack#ctf#reversing+9
2026-07-25#dreamhack +8
[๐Ÿฅ‰ Bronze 3] ์•ˆ๋“œ๋กœ์ด๋“œ APK ์† SEED-128 CBC ํ‚ค๊ฐ’ ๋ณต์› โ€” DreamHack [CodeEngn] MobileApp L01 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] ์•ˆ๋“œ๋กœ์ด๋“œ APK ์† SEED-128 CBC ํ‚ค๊ฐ’ ๋ณต์› โ€” DreamHack [CodeEngn] MobileApp L01 ํ’€์ด

SmartApp L01.apk ๋ฅผ jadx ๋กœ ๋œฏ์–ด๋ณด๋‹ˆ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Security.DecryptStr() ๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ hex ๋ฌธ์ž์—ด์„ SEED-128 CBC ๋กœ ๋ณตํ˜ธํ•ด "Key" ๋กœ ๋„์šด๋‹ค. ์•”ํ˜ธ๋ฌธ์€ Java BigInteger ์˜ ๋ถ€ํ˜ธ ์žˆ๋Š” 2์˜ ๋ณด์ˆ˜๋กœ ์ธ์ฝ”๋”ฉ๋ผ ์žˆ๊ณ , key ์™€ IV ๊ฐ€ ์ •์  ๋ฐฐ์—ด์— ๊ทธ๋Œ€๋กœ ๋ฐ•ํ˜€ ์žˆ๋‹ค. openssl ๋กœ ๊ทธ๋Œ€๋กœ ๋ณตํ˜ธํ•ด ํ‚ค๊ฐ’ H3ll0 C0de3ngn ๋ฅผ ์–ป๋Š”๋‹ค.
#dreamhack#ctf#reversing+6
2026-07-16#dreamhack +8
[๐Ÿฅ‰ Bronze 3] smali์— ํฉ์–ด ๋‘” ์ƒ์ˆ˜๋กœ ์กฐ๋ฆฝ๋˜๋Š” ํ”Œ๋ž˜๊ทธ โ€” DreamHack Summer Fan ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] smali์— ํฉ์–ด ๋‘” ์ƒ์ˆ˜๋กœ ์กฐ๋ฆฝ๋˜๋Š” ํ”Œ๋ž˜๊ทธ โ€” DreamHack Summer Fan ํ’€์ด

APK๋ฅผ apktool๋กœ ๋œฏ์–ด smali๋ฅผ ์ฝ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œ. ํ”Œ๋ž˜๊ทธ๋Š” 32๊ฐœ ์ •์ˆ˜ ๋ฆฌ์ŠคํŠธ FLAG์™€ ํ•œ ๊ธ€์ž์”ฉ ์ชผ๊ฐœ ๋†“์€ ๋ฌธ์ž์—ด KEY๋ฅผ XORยท๋บ„์…ˆ์œผ๋กœ ์กฐํ•ฉํ•ด ๋งŒ๋“ ๋‹ค. gen(i) ๋ณด์ •ํ•ญ๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•˜๋ฉด BISC ํ˜•์‹์˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณต์›๋œ๋‹ค.
#dreamhack#ctf#reversing+4
2026-07-13#dreamhack +4