Rating: 5.0

# Square CTF 2018 - C10: fixed point

## Description
A handwritten note has been added to C10’s label.

```
If you are a Charvis then this is a simple application of Xkrith’s First and Sixth Theorems. If you are not a Charvis then you should familiarize yourself with Xkrith’s works. A primer can be found in Room 100034B.
```

Note: For the humans out there, this system is built on an oscillator. It’ll disable itself when you find the oscillator’s fixed point.

Good luck!

## Solution
The Javascript code in the given [HTML file](./fixed_point.html) applies the function below to our input `x`, and gives us the flag if and only if `x` is a fixed point (i.e. `f(x) = x`).

```
function f(x) {
if ((x.substr(0, 2) == '?') && (x.slice(-2) == '?')) {
return x.slice(2, -2);
}
if (x.substr(0, 2) == '?') {
return '?' + f(x.slice(2));
}
if (x.substr(0, 2) == '?') {
return f(x.slice(2)).match(/..|/g).reverse().join("");
}
if (x.substr(0, 2) == '?') {
return f(x.slice(2)).repeat(5);
}
if (x.substr(0, 2) == '?') {
var t = f(x.slice(2));
return t.substr(0, t.length/2);
}

return "";
}
```

This function reads our input `emoji` by `emoji` interpreting each one of them as an instruction. Those instructions are pushed on the top of a stack. The final output of `f` is the result of applying all those instructions starting from the top of the stack, i.e. last in first out.

The mapping between `emojis` and instructions is the following:

- ? -> put ? on the stack
- ? -> put `reverse` on the stack
- ? -> put `repeat(5)` on the stack
- ? -> put `substr(0, t.length/2)` on the stack
- ?`x`? -> put `x` on the stack (exit case)
- default -> put `''` on the stack (exit case)

We can do the following observations.

1. The only `emoji` that we can create is ?.
2. Following from `1.` , the only way we have to "create" other `emojis` is trough the `repeat(5)` operation. Of course the `emojis` we want to "create" have to be in the argument of `repeat(5)`.
3. From what above we conclude that the only acceptable exit case is ?`x`?, and that `x` has to include all the `emojis` we need to "create".
4. ?? corresponds to the unit operation.
5. ??? translates to `[reverse, ? at beginning, reverse]`. The result of those three instructions will be adding a ? at the end of our current sequence.

Now we have enough information to start building our input!

Let's define it to be `x`?`x`?, where `x = y`???. This will translate into `[..y.., reverse, ? at beginning, reverse, x]`. Remebering that we have to apply the instructions backwards (i.e. starting from the right), after applying the first four we will end up with the following situation:

- Partial output: `x`?
- Stack: `[..y..]` (i.e. the instructions encoded in `y`)

Thus, if we manage to have `y` such that its aggregation corresponds to `repeat(2)` we are done.
In other words we want to find a `u`and `v`such that:

```
1 * 5^u * 2^-v = 2
```

Unfortunately there is no integer solution to this equation, but we can overcome this limitation by generalizing what stated above. We can define our input to be `x`? repeated `n` times (with `x` defined as before), so that, after applying the first four operations, the situation will be:

- Partial output: `x`? repeated `n-1` times
- Stack: `[..y..]` (i.e. the instructions encoded in `y`)

The equation to solve becomes:

```
(n-1) * 5^u * 2^-v = n
```

Which hopefully has `{n = 5, u = 1, v = 2}` as a solution.

We obtain `y=`???, thus `x=`??????. Now we repeat `x`? five times and we are done!

???????????????????????????????????

`flag-2d4584368d09da2187f5`

## Bonus

### Quines
The function `f` of this challenge is actually a [quine](https://en.wikipedia.org/wiki/Quine_(computing)). Quines are programs that print out their own source code.

### Infinite solutions ??
Since ?? corresponds to the unit operation, there were an infinite number of solutions: one can add to his input as many couples of ? as he wants.

Beside this, there are many solutions to the equation presented above and `{n = 5, u = 1, v = 2}` is only one of them.

Original writeup (https://github.com/ctf-epfl/writeups/tree/master/square18/c10_fixedpoint).