Blog

Everything I can write.

  • The CSC 2026 Payslip Portal: Three Bugs Where the File You Can Write Is the File You Run

    Part two of the CSC 2026 finals. After the ransomware recovery came the attack-and-defence round, and one service fell to a chain of three — an unauthenticated CBC cookie became a padding oracle that forged an HR role, an HR-only template preview handed the live PDF generator to a Go template and turned it into a file write, and that file write landed on the one Go source the service re-interprets on every payslip.

    13 min read 2,576 words Category: Security Tags: ctf, web, cryptography

  • Reversing the CSC 2026 Ransomware Unlocker: A Fake gdb, a Salt Born in a SIGTRAP Handler, and an Invertible Check

    How our team recovered the files a CTF ransomware encrypted at the CSC 2026 finals, by reversing the 4.9 KB unlocker it left behind, finding the salt it computes only inside a SIGTRAP handler, inverting its flag check, and rebuilding its SHA-256 and RC4 key schedule in Python, then restoring 43 files on six hosts from the organisers' inventory with a runbook and two scripts.

    20 min read 3,908 words Category: Security Tags: ctf, reverse engineering, ransomware

  • EEG Basics for Machine Learners: Sampling, Filtering and Band Power

    The signal-processing vocabulary needed before training anything on EEG, worked through on a clearly synthetic signal in NumPy, with the pitfalls that quietly inflate reported accuracies.

    11 min read 2,039 words Category: AI Research Tags: neuroai, bci, signal processing

  • Binary Hardening on Linux: What Canaries, NX, ASLR, RELRO, FORTIFY and CET Actually Stop

    A tour of the compiler, linker and kernel mitigations inside a modern Linux binary, what each one prevents and does not prevent, and how to verify all of them with readelf, objdump and checksec.

    16 min read 3,078 words Category: Security Tags: binary security, linux, compilers

  • TCP from the Wire: Reading a Real Handshake

    A tcpdump capture of one HTTP request over loopback, packet by packet: the three-way handshake, sequence numbers, window scaling, teardown, and where flow and congestion control fit in.

    14 min read 2,720 words Category: Software Tags: networking, tcp, tcpdump

  • Lock-Free Queues and Memory Ordering: An SPSC Ring Buffer Measured Against a Mutex

    A single-producer single-consumer ring buffer in C11 atomics, the happens-before argument that makes acquire/release enough, ABA and MPMC caveats, and a measured comparison with pthread_mutex queues.

    11 min read 2,106 words Category: HPC Tags: lock free, atomics, memory ordering

  • Contrastive Learning Intuition: InfoNCE, Temperature, Alignment and Uniformity

    What the InfoNCE loss actually optimizes, why the temperature matters, and a NumPy experiment that trains a two-dimensional embedding with a hand-derived gradient and shows the before and after.

    8 min read 1,558 words Category: AI Research Tags: representation learning, self supervised, contrastive

  • conero: Spending One Note Eight Times Because the Subgroup Check Is in the Wrong Function

    A write-up of the blockchain challenge conero from the Codegate 2026 qualifiers, where a patched geth implements Monero-style ring signatures, writes a careful canonical-key-image check, and then verifies proofs in a function that never calls it — so one note yields eight key images and drains the pool.

    9 min read 1,724 words Category: Security Tags: ctf, blockchain, cryptography

  • GPU Memory Hierarchy and Occupancy: Why a Tiled Kernel Is Just Cache Blocking by Hand

    The CUDA execution model, global versus shared memory, coalescing, bank conflicts and occupancy, with a tiled matrix multiplication and a block reduction written out in full and traced back to the cache ideas of the CPU posts.

    16 min read 3,196 words Category: HPC Tags: cuda, gpu, memory hierarchy

  • Small ROS: Eighty-One Random-Oracle Equations That Collapse Into One Subset-Sum

    A write-up of the crypto challenge Small ROS from the m0leCon 2026 finals, where choosing the rows of an overdetermined random-oracle system turns eighty of its equations into coordinate lookups, leaves one, and reduces the whole verifier to a modular subset-sum that a lattice solves.

    9 min read 1,712 words Category: Security Tags: ctf, cryptography, lattices