← Back to EHAX 2026

compute it

Reverse Engineering 208 pts

Challenge Description

the computation prof gave me some data and a executable, what does he want from me?

Files provided:

  • signal_data.txt - 2600 lines of comma-separated (x, y) coordinate pairs
  • validator - ELF 64-bit x86-64 binary (not stripped, compiled from validator.cpp)

Analysis

Binary Reverse Engineering

The validator binary takes two command-line arguments: a real and imaginary component of a complex number. Disassembly of main reveals it implements Newton's method for finding roots of the polynomial f(z) = z^3 - 1.

The algorithm:

  1. Parse real (x) and imag (y) from command-line arguments
  2. Iterate up to 50 times:
    • Compute f(z) = z^3 - 1:
      • Real part: A = x^3 - 3*x*y^2 - 1.0
      • Imaginary part: B = 3*x^2*y - y^3
    • Compute f'(z) = 3z^2:
      • Real part: C = 3*(x^2 - y^2)
      • Imaginary part: D = 6*x*y
    • Check if |f'(z)|^2 < 1e-9 (derivative too small, bail out)
    • Apply Newton step: z = z - f(z)/f'(z) (complex division)
    • Increment iteration count
    • Check convergence: |Re(z) - 1| < 1e-6 AND |Im(z)| < 1e-6 (converged to root z=1)
  3. If iteration count == 12: print "AUTHORIZATION ACCEPTED: Node Valid."
  4. Otherwise: print "AUTHORIZATION DENIED: Node Invalid."

Key constants extracted from .rodata:

  • 0x20d0: 3.0 (used in f(z) and f'(z) computation)
  • 0x20d8: 1.0 (the -1 in z^3 - 1, and the target root)
  • 0x20e0: 6.0 (coefficient in imaginary part of f'(z))
  • 0x20e8: 1e-9 (derivative magnitude threshold)
  • 0x20f0: 1e-6 (convergence tolerance)

Data Processing

Each of the 2600 points in signal_data.txt was run through the Newton's method algorithm. Points that converge to root z=1 in exactly 12 iterations are marked as 1 (valid), all others as 0 (invalid).

This produces a 2600-bit binary string. Arranging these bits as a 130x20 grid reveals ASCII art text rendered in a 5-row pixel font:

#### #  # #  # #  #   ## ###  #### #   # ###  ##  ###       #   # #  # ####       ####   #  #### #  # ###   ##
#    #  # #  #  ##   ##  #  #    # #   #  #  #  # #  #      #   # #  # #          #  #  ##  #    #  #  #   ##
###  #### ####   #   #   #  #  ### # # #  #  #  # #  # #### # # # #### ###  ####  ###    #  # ## ####  #   #
#    #  #    #  ##   ##  #  #    # ## ##  #  #  # #  #      ## ##    #    #       # #    #  #  # #  #  #   ##
#### #  #    # #  #   ## #  # #### #   #  #   ##  #  #      #   #    # ####       #  # #### #### #  #  #    ##

Verification

# Point that converges in exactly 12 iterations -> ACCEPTED
$ ./validator 0.689743 1.844815
AUTHORIZATION ACCEPTED: Node Valid.

# Point that converges in 10 iterations -> DENIED
$ ./validator -1.652406 -0.049086
AUTHORIZATION DENIED: Node Invalid.