Backdrop
An x86_64-only Flutter challenge that forces Impeller down a broken emulator path, then turns the APK signing certificate into the key for revealing its flag.

37 articles
An x86_64-only Flutter challenge that forces Impeller down a broken emulator path, then turns the APK signing certificate into the key for revealing its flag.
We cleared an entire CSAW wave in 4 minutes and 32 seconds. We were using AI agents ourselves, and it left me questioning what online CTFs are measuring.
Twenty-six challenges I shipped for Securinets INSAT's beginner CTF: one Android app holding the whole Mobile track, and a reverse engineering ladder from ltrace to Cheat Engine.
An anti-debug check refuses to run under a debugger, so you let it run, let it get its answer, then change that answer in a register before the program reads it.
The badge code is stored scrambled so strings finds nothing, but the program checks your input with strcmp, and ltrace prints both sides of that comparison.
The profile endpoint takes any valid token and hands back whichever account id you ask for, so you change the id in the request and read someone else's record.
The app writes a sensitive value to logcat during normal use; capture it with adb while driving the screen.
The biometric prompt's success callback is trusted client-side with no CryptoObject, so hooking it opens the vault with no fingerprint.
Five times to hit in a row, each counted only while the app genuinely reads that time, verified by the server, so you hook the exact clock the checker reads and feed it each target.
A hardcoded account name and an MD5 of its password ship in the APK; crack the hash, then let the server verify the plaintext.
The JWT is signed correctly with HS256 but the secret is a rockyou.txt word, so you crack it offline, mint a token that says role admin, and re-sign it.
The login form builds a SQL query by pasting your input into a string, so a single quote breaks out and you log in as admin without the password.
The paid-or-not decision runs entirely on the device, so you patch the smali that makes it (or hook it) to return licensed, and the app computes the flag for you.
A native library still exports the unseal routine for a note format the UI dropped, and nothing in the app calls it, so you call it yourself with the live nonce from the server.
A diagnostics screen was dropped from the app's navigation but is still exported in the manifest, so it can be launched directly with adb.
The login talks over plain HTTP and the response carries an extra field the app never shows, so anything sitting on the wire reads the flag out of the body.
A 10 MB Linux binary that is really a PyInstaller bundle, so you extract it, decompile the Python bytecode, and read the passphrase and flag unsealing straight out of the source.
A licence check hashes a file against a constant you are not meant to match, so instead of passing it you patch the function to return 1, or set its return value in gdb.
The app pins its server certificate so an ordinary proxy fails, so you disable the pinning on the device with Frida and read the audit response the app never shows.
The flag is a plain string resource inside the APK; decoding the app's resources reads it straight out.
The binary checks in with a server that does not exist, so you read the hostname out of its DNS query with strace, point that name at yourself, and answer its HTTP request with the token it sends you.
The key check is a hand-written XOR-and-rotate loop compared against a table in .rodata, so there is no library call to trace and you have to read the loop and run it backwards.
Triage an unfamiliar Windows executable, trace its runtime API calls, and build a receiver for the behavior you uncover.
A bundled analytics SDK the app didn't write ships telemetry to its own server on a different host and port, and the reply carries a value the app never shows.
The app encrypts a value with AES but ships the key and IV right beside the ciphertext, so you decrypt it yourself.
A Sekiro-inspired fly-hacking challenge: find live vertical velocity with Cheat Engine, or recover the flag offline by reversing the native DLL.
Two ways through a Godot runner: edit jump power with Cheat Engine, or reverse the native DLL and recover the encrypted flag offline.
A value the app saved to its own private SQLite database stays on disk after the screen stops showing it; read it off the data directory.
The Firebase database has its read rule left open, so the whole customer table dumps over REST and one password hash in it is crackable.
Brute-forcing an obfuscated Go binary by targeting instruction alignment vulnerabilities.
Repairing a corrupted ELF header and bypassing multiple layers of ptrace anti-debugging.
Bypassing massive function-pointer obfuscation and usleep slowdowns via GDB scripting.
Reversing embedded PDF JavaScript and brute-forcing Steganographic image layers.
Race-condition extraction of temporary runtime scripts and self-integrity MD5 patching.
A multi-stage challenge involving self-modifying code, network handshakes, and cryptographic brute-forcing.
Connecting ESP32 firmware, MQTT, and FastAPI to monitor a greenhouse and keep local control running during network outages.
A deep dive into building a real-time ML pipeline for road safety with sub-300ms latency.