San Diego CTF 2021 - Desmos Pro

Reversing – 799 pts (5 solves) – Chall author: k3v1n

Math lock created in Desmos. Reversable through mathematical investigation.

Challenge

We are linked to an online Desmos file (see link above), where we are greeted by a red square. If we are able to turn the red square to green, we are able to retrieve the flag.

Solution

Upon inspection we find that in order to turn the square green we need to find the correct sequence p, consisting of 144 elements in {0,1,2,3}. Clearly not brute-forcable :c.

The criteria for the colouring of the square reveal that we need to find p such that C=0,

C=\left|X\left(l\right)-x_{f}\right|+\left|Y\left(l\right)-y_{f}\right|+\sum_{j=0}^{l}M\left(g\left(0,X\left(j\right),x_{max}-1\right),g\left(0,Y\left(j\right),y_{max}-1\right)\right)

From the above we can see that all three elements have to be zero in order for C to become zero. The first element, with the X function, implies that our p sequence needs to have 10 more 1’s than 3’s, whereas the second element, with the Y function, implies that our p sequence needs to have 10 more 2’s than 0’s. However, this on its own is still not enough to start brute-forcing our way through. The trick to this challenge is to understand the third element, the scary looking sum. For the sum to be zero, all individual call to M should return zero as it can only return 0 or 1. Interestingly, we note that M is dependent on sequential calls of X and Y, hence the order of p seems to matter too.

Knowing all of this, we can set-up a plan. Let us try to investigate the possible outcomes of M given values of X and Y. We know that it starts of with l=0, so X=0 and Y=20, and ends with l=144, so X=10 and Y=10. When we plot M as a function of both X and Y outputs we find some kind of maze!

Like mentioned before, we start at X=0, Y=20 (green dot) and need to end up at X=10, Y=10 (red dot) in 144 steps. Through testing with the X and Y functions we find that the values of p correspond to moving through the maze in a certain direction following 0: right, 1: down, 2: left, 3: up. We can now find our solution sequence of p to be

[2,2,1,1,0,0,1,1,2,2,1,1,0,0,1,1,1,1,2,2,3,3,2,2,2,2,3,3,3,3,3,3,2,2,2,2,2,2,3,3,2,2,1,1,2,2,2,2,1,1,2,2,1,1,1,1,0,0,0,0,0,0,1,1,0,0,3,3,0,0,0,0,1,1,0,0,0,0,1,1,2,2,1,1,1,1,0,0,1,1,2,2,2,2,3,3,2,2,1,1,2,2,1,1,2,2,2,2,2,2,2,2,3,3,0,0,0,0,0,0,3,3,2,2,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,0,0,0,3,3]

from which we retrieve our flag to be

sdctf{440778777}

Ta-da!