Rating:

# Two Truths and a Fib

## Challenge:

Can you catch the fibber?

nc umbccd.io 6000

## Solution:

Let's connect to the server:

```bash
$ nc umbccd.io 6000
Welcome to two truths and a fib! You'll be given three numbers:
one of them will be a fibonacci number and two of them will not.
It's your job to tell which is which and send back the fibonacci.
Example:
12, 8, 4
Which number is a fib?
>> 8
Correct!

[6947430254846, 1597, 5502044371417]
>>
Oof, too slow!
```

We're given a set of numbers and we need to figure out which one is a [Fibonacci number](https://en.wikipedia.org/wiki/Fibonacci_number).

Calculating the entire sequence for every set would be crazy. Thankfully, there's [a formula](https://math.stackexchange.com/questions/9999/checking-if-a-number-is-a-fibonacci-or-not) we can use to figure it out quickly. We need to get the square root of 5 times our number squared, plus or minus 4, and see which one is an integer. The perfect cube will be our Fibonacci number.

We can use [pwntools](https://github.com/Gallopsled/pwntools) to make a connection and parse the output:

```python
from pwn import *
import re

conn = remote('umbccd.io',6000)

count = 0
while True:
if count == 100:
print(conn.recvline())
break

question = conn.recvuntil(']\n>>')

numbers = re.search('\[(.*)\]', str(question))
numbers = numbers[1].split(', ')

fibonacci = '0'

for i in numbers:
add = math.sqrt((5*int(i)**2)+4)
sub = math.sqrt((5*int(i)**2)-4)
if add.is_integer() or sub.is_integer():
fibonacci = i

conn.send(fibonacci + '\n')
conn.recvuntil('\n\n')

count = count + 1
```

This will run through 100 different challenges for us followed by our flag:

```bash
[+] Opening connection to umbccd.io on port 6000: Done
b"Congrats! Here's your flag: DawgCTF{jU$T_l1k3_w3lc0me_w33k}\n"
[*] Closed connection to umbccd.io port 6000
```

There it is: `DawgCTF{jU$T_l1k3_w3lc0me_w33k}`.

Original writeup (https://github.com/mcmahoniel/ctf_write-ups/blob/main/2021/dawgctf/misc/two_truths_and_a_fib/README.md).