HI Cyber Con CTF 2026. Mobile.

VaultKeeper

The app builds its flag and throws it away. The lab rebuilt every step offline in 47 minutes.

Published 2 November 2026. Challenge by Hidden Investigations.

The brief

"Your master key. Deep cold storage. One tap away." VaultKeeper is the most secure mobile vault ever shipped. The marketing deck says so, twice. Your balance is already waiting inside, and the key to the whole vault is just one button press away. Well. One button press for someone. The APK is right here. See if the vault opens for you. If it doesn't, maybe you didn't earn it.

  • VaultKeeper.zip, 3.5 MB

In short

VaultKeeper computes its flag in a native library and then discards it, behind a hidden gesture and anti-tamper checks. The guards never touch the flag bytes, so the Offensive Lab rebuilt the whole chain offline, through the app's own virtual machine, and confirmed the result with the SHA-256 tag the app ships.

A button that throws the flag away

The claim button calls a native library that computes the flag and then drops it. The dialog shows a fixed message, so the flag never reaches the screen, whoever presses the button.

Two guards outside the math

The button stays dead until a hidden gesture, three taps on the shield and a long press on the subtitle. Anti-tamper checks only choose between the flag and a 29 byte fallback. Neither guard changes a flag byte.

Four decoy flags

The app plants four fake flags, one in the log, one in the library's strings and two behind simple XORs. The app also carries a hash tag of the real flag, and none of the four matches it.

From one file to a hidden program

Everything starts from vault.bin, 8,192 bytes. SHA-256 turns it into 128 cells, seven mixing rounds stir them, and the result decrypts a 2,048 byte program. A CRC-32 gate in the app confirms each stage so far.

A machine that spins 100 million times

The program runs on the app's own virtual machine, 8 registers and 512 bytes of memory. It spins 100,000,000 rounds on purpose before it writes 64 bytes. The lab rebuilt the machine and ran the loop in about two minutes.

The app's own hash says yes

Those 64 bytes, XORed with three keys stored in the library, give 51 bytes. Hashed with the app's VK-TAG-2026 label they match the shipped tag 62672db1 exactly. That is the flag.

The insight

The guards only chose which value got stored, never the flag bytes, so the whole chain could run offline and the app's own tag proved it.

The flag

hiCTF{!!I_10v3_4ndr0!d_m4n_m4k!ng_th3m_f331_g0Od!!}

Loading