Tags: misc fibonacci caesar 

Rating:

Connecting to Shifter we are greeted with the following:

```
Solve 50 of these epic problems in a row to prove you are a master crypto man like Aplet123!
You'll be given a number n and also a plaintext p.
Caesar shift `p` with the nth Fibonacci number.
n < 50, p is completely uppercase and alphabetic, len(p) < 50
You have 60 seconds!
--------------------
Shift BXRUJEAKBPSKTXDOXETQV by n=22
:
```

They give us a number `n` and a caesar cipher.
Easy enough, we can steal the implementations from StackOverflow (or write them ourselves) and do the following:

```py
def get_last_line(text):
return text.split("\n")[-2]

def get_info(line):
l = line.split(" ")
return (l[1], l[-1].split("=")[1])
`
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while True:
data = s.recv(1024)
if not data:
break
text = data.decode("utf-8")
print(text)
cipher, n = get_info(get_last_line(text))
fN = fib(int(n))
shifted = caesar(cipher, fN)
print(shifted)
s.sendall(bytes(shifted + '\n', 'utf-8'))
```

`fib` and `caesar` are the implementations for Fibonnaci and Caesar cipher, respectively, both taken from some place on the internet, hence not being shown.

Breaking the script down:

```py
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
```

The code above will connect us to the challenge, then we just need to receive the buffer and parse it.
I used these two functions:

```py
def get_last_line(text):
return text.split("\n")[-2]

def get_info(line):
l = line.split(" ")
return (l[1], l[-1].split("=")[1])
```

Afterwards we just cast `n`, calculate it, and shift the given cipher.

Original writeup (https://jmg-duarte.github.io/posts/ctfs/angstrom/shifter/).