$ cat writeup.md…
$ cat writeup.md…
ASIS CTF Quals 2026
Task: reverse a stripped static-PIE ELF with a six-lane `e`/`s` stdin protocol, fingerprints, and a final decrypt gate. Solution: recover the protocol internals, replay captured compare buffers, then emulate `c255c0` with the correct helper behavior to decrypt `flag.enc`.
$ cat /etc/rate-limit
Rate limit reached (20 reads/hour per IP). Showing preview only — full content returns at the next hour roll-over.
No separate organizer description was preserved in the local task files.
We are given a stripped static-PIE x86-64 ELF that reads commands from stdin in the form e <lane> <hex> and s <lane> <hex>. The binary maintains six lane states, emits long fingerprint values after successful e transitions, and only reaches the final flag logic after a later multi-lane verification step.
e takes 160 input bytes. Internally the binary derives a 160-byte target buffer on the stack and compares the user data against it.e probe plus a hook at the compare site is enough to capture that target buffer. Resubmitting the captured bytes produces a genuine e success and prints the lane fingerprint.e transitions on the same lane satisfy the marker-length gate that enables s.s takes 176 input bytes. After the state checks and anti-replay check, the acceptance condition is derive(X, lane)[160:176] == 0.s solutions: for each lane, XORing the same 16-byte delta into blocks 5 and 6 preserves the zero-check, giving a 128-bit affine family of accepted records.s inputs themselves.The final outer verifier hashes the six stored 176-byte lane records and compares the resulting 16-byte value against:
10fe0df1471d48b5226d8b3b9e3559f3
fast_5f.py reproduced that outer hash exactly for our reconstructed records and showed that our valid record set lands on a different stable value:
9ff5c6459a95c5f7346e70377b304785
...
$ grep --similar