The challenge
"Mobile packages have been mirrored under friendly filenames. Recover Android package identities, distinguish rebuilds from clones, and expose the borrowed product name."
| answer_id | Question | Format |
|---|---|---|
d21- |
"Determine apk.package_name for mobile-001.apk." | exact text: "exact artifact-derived value only, without quotes or explanatory text unless quotes are part of the value; use the literal none only when the requested field is absent"; trimmed |
The Time Trial asked 26 questions: every earlier day's field (roster, evidence note, JPEG, PNG, PDF, ZIP, PE, .NET, MSI, LNK, OOXML, email, audio, video, ELF, Mach-O), today's package name, and the SHA-256 ordering synthesis. The Mastery asked the same family across 5 sets (130 questions).
Reading the prompt: what it said we'd need
| Clue | What it pointed to | What I did about it |
|---|---|---|
| "mirrored under friendly filenames" | The APK sits in the evidence zip under a generic name (mobile-), so the name says nothing about the app |
Read the identity from inside the APK, not from the filename |
| "Recover Android package identities" | The package attribute of <manifest> in the binary AndroidManifest. |
The pre-built parser's AXML reader returns it verbatim; that answered the one new field |
| "distinguish rebuilds from clones" | Signing (META- signature files) and version fields |
Not asked today. The pre-built parser already has signed / signature-file / version fields if a later day asks |
| "expose the borrowed product name" | Probably the app's android:label (Huntress Evidence 08281778 here) |
Not asked today; noted for later |
What was in the files
- Single Solve:
metadata-day-21-evidence.zip, 4,436 bytes, one member:mobile-001.apk, 8,535 bytes. Inside: a binaryAndroidManifest.xml(1,840 bytes), a 912-byteclasses.dex, and v1 signing files (META-INF/MANIFEST.MF,FIXTURE-.SF,FIXTURE-.RSA, certificate subject "Huntress Artifact Assembly Line", Huntress Labs). The manifest gives packagecom.huntress.arena.p08281778, version name1.0, labelHuntress Evidence 08281778, and one launcher activity.MainActivity. - Time Trial:
evidence.zip, 632,986 bytes, 17 members: one sample per earlier day's file type (fromcamera-001.jpgtomacos-001.bin) plus the same 8,535-bytemobile-001.apk. - Mastery: one 3,166,036-byte zip of 5 evidence sets (
evidence-01.zip…), 130 questions. The per-set questions rotate which file is renamed (for example "the renamed evidence-note copy").
Every APK in every mode gave the same package name, so the timed variants reused the template with the same APK value. The Mach-O sample was still thin arm64 in every set (["0x0100000c"]), so Day 20's fat / ar ordering rule is still unconfirmed.
Single Solve
The solver solved it with no stop. Its preparation step started the Single Solve untimed and checked the one question. The field apk-package-name was new, but a parser we had built ahead of time already covered it:
- A pre-built media and package parser (built 2026-10-15, before the day). It has its own reader for Android binary XML and maps
package-name(alsopackage,package-id,app-package,application-id) to<manifest package>, verbatim. Its tests compare it withaapt's output on anaapt-built APK and on saved Android-lane APKs. - The solver was our Day 20 Metadata solver, which loads that parser through its chain. No code was written today and no candidate guessing was needed.
Because the one question was already covered, the solver sent the Single Solve on its own. It logged a harmless note twice: one module skipped two field names (pe-signed, pe-is-signed) that another module already registers.
started_at 2026-10-21T13:01:43.849Z
deadline none (Single Solve)
answers 1 com.huntress.arena.p08281778
start 175 ms (the send step's start, resuming the attempt the preparation step opened)
artifact 347 ms
solve 1 ms
submit 565 ms
TOTAL 1087 ms (submit +6.86 s after started_at; the preparation step ran in between)
result CORRECT flag 99dcb231…c0cc
Before the timed runs, a regression rehearsal replayed 93 saved attempts: slowest 0.08 s, identical on every Mastery set; it passed.
Time Trial
CORRECT on the first attempt, ranked. The start reply showed unique_attempts_remaining: 31.
started_at 2026-10-21T13:02:03.783Z
deadline 2026-10-21T13:02:53.783Z (50 s)
answers 26
start 417 ms
artifact 274 ms
solve 12 ms
submit 586 ms
TOTAL 1289 ms (submit +1.07 s after started_at)
result CORRECT flag af3380c4…7c63
Mastery
CORRECT on the first attempt, ranked (5 sets, 170 s clock).
started_at 2026-10-21T13:02:10.276Z
deadline 2026-10-21T13:05:00.276Z (170 s)
answers 130 across 5 sets
start 289 ms
artifact 394 ms
solve 87 ms
submit 799 ms
TOTAL 1570 ms (submit +1.39 s after started_at)
result CORRECT flag 1d74d30f…912c
Time to solve
All three modes were solved by 09:02:11 ET, 28 s after the solver's first start request at 09:01:43 ET, and each went through on the first submit; both timed modes were ranked. The finish, 2 min 11 s after release, was set by the late start: the catch-up run began at 09:01:40 instead of 08:58.
Takeaways
- Pre-building paid off again. The APK manifest reader was written six days early as a guess; today it answered the new field first time, so the lane needed no candidate guessing.
- The prompt promises more than the questions ask. "Rebuilds from clones" and "the borrowed product name" weren't asked today. They may come back as fields on later days, and the parser already covers signing and versions.
- The late start cost more than the solve. The whole lane took 28 s; the late start cost about 3 min 39 s against the schedule.