문제 파일
SUMMER_FAN.apk
jadx로 apk를 디컴파일하면 답이 나온다.
package com.example.summer; import java.util.List; import kotlin.Metadata; import kotlin.collections.CollectionsKt; /* compiled from: MainActivity.kt */ /* loaded from: classes.dex */ public final class MainActivityKt { private static final List<Integer> FLAG = CollectionsKt.listOf((Object[]) new Integer[]{220, 211, 180, 230, 192, 22, 341, 220, 227, 341, 139, 163, 355, 293, 333, 196, 142, 216, 376, 133, 248, 26, 342, 378, 231, 149, 145, 173, 185, 1, 10, 198}); private static final List<String> KEY = CollectionsKt.listOf((Object[]) new String[]{"h", "o", "t", "_", "h", "o", "t", "_", "s", "u", "m", "m", "m", "e", "r", "r"}); public static final List<Integer> getFLAG() { return FLAG; } public static final List<String> getKEY() { return KEY; } }
private final String generateFlag() { ArrayList arrayList = new ArrayList(); int size = MainActivityKt.getFLAG().size(); for (int i = 0; i < size; i++) { arrayList.add(Character.valueOf((char) ((MainActivityKt.getFLAG().get(i).intValue() ^ StringsKt.first(MainActivityKt.getKEY().get(i % MainActivityKt.getKEY().size()))) - gen(i)))); } return CollectionsKt.joinToString$default(arrayList, "", null, null, 0, null, null, 62, null); } private final int gen(int i) { int size = MainActivityKt.getKEY().size(); return (((int) Math.pow(i, 3.0d)) % 256) ^ StringsKt.first(MainActivityKt.getKEY().get(size - ((i % size) + 1))); }
위 소스코드를 토대로 복호화시키는 코드를 작성해보았다.
import math; FLAG = [220, 211, 180, 230, 192, 22, 341, 220, 227, 341, 139, 163, 355, 293, 333, 196, 142, 216, 376, 133, 248, 26, 342, 378, 231, 149, 145, 173, 185, 1, 10, 198] KEY = ["h", "o", "t", "_", "h", "o", "t", "_", "s", "u", "m", "m", "m", "e", "r", "r"] REAL_FLAG = [] def gen(i): size = len(KEY) ret = (int(math.pow(i, 3)) % 256) ^ ord(KEY[size - ((i % size) + 1)]) return ret for i in range(len(FLAG)): glyph = (FLAG[i] ^ ord(KEY[i % len(KEY)])) - gen(i) REAL_FLAG.append(chr(glyph)) print(''.join(REAL_FLAG))
Flag
BISC{it_1s_so_hott_4c5515c5553a}