write-ups-challenges-2023-2024/i-found-better-friends/SOLUTION.md
2023-11-28 16:24:59 +01:00

73 lines
1.8 KiB
Markdown

## Difficulty
50/100
## Category
Programming
## How To Solve
Each of the 'friends' will give you harder and harder mathematical
puzzles to solve. Everytime you solve one you get to know a new friend.
Their names are always the first letter of the flag and then something
random. This is obvious because if you print them out the first couple
of friends are called I, G, C, T, F which spells IGCTF. The flag is
then the first names of all friends back to back `IGCTFBR0M4NCE`.
To solve these math puzzles, you need to write a program because they
have to be solved within 10 seconds. You can use a python module to do
it afaik, but I wrote a dead simple script that uses eval and some
string replacements.
```python
from pwn import *
import time
def sin(exp): return math.sin(math.radians(eval(str(exp))))
def cos(exp): return math.cos(math.radians(eval(str(exp))))
def sqrt(exp): return math.sqrt(eval(str(exp)))
def solve(expression):
newexpr = ''
for i, c in enumerate(expression):
if c == '|' and expression[i-5:].startswith('sqrt'):
newexpr += "abs("
elif c == '|':
newexpr += ')'
else:
newexpr += c
#print(newexpr)
return str(eval(newexpr))
conn = remote('localhost', 3005)
#conn = process(['python3', './friend-generator.py'])
time.sleep(0.1)
print(conn.recv())
conn.send('yes\n'.encode())
time.sleep(0.1)
names = []
while True:
data = conn.recv().decode()
try:
name = data[data.index('name'):].split('\n')[0][8:].split(',')[0]
expression = data[data.index('first: '):].split('\n')[1]
except ValueError:
print(data)
exit(0)
solution = solve(expression)
#print(f"= {solution}")
print(name)
names.append(name)
conn.send((solution + "\n").encode())
time.sleep(0.1)
```
## Hints
n/a
## Flag
IGCTFBR0M4NCE