sch9_ctf_3/tasks/sasaaageyooo/readme.md

53 lines
2.1 KiB
Markdown
Raw Normal View History

2023-08-28 07:59:20 +00:00
# Разбор таски Сасааагеёёё
> Это отсылка на Атаку титанов.
> Чтобы забрать флаг, нужно выиграть в игру
>
> sasaaageyooo.ctf.sch9.ru
Игра, которая дана на веб страничке называется ним (можно было найти это в поисковике). В интернете много статей по тому, как выигрывать в неё. Стратегия заключается в следующем: нужно чтобы после каждого твоего хода побитовый xor (побитовое исключающее или) количества элементов в кучках было равно 0.
2023-08-28 16:52:41 +00:00
Заметим, что всё взаимодействие с сервером происходит через WebSockets (можно увидеть в javascript страницы), тогда, давайте общаться с сервером напрямую, не через браузер (аналогичный код можно написать и в браузере конечно)
Давайте напишем код, который будет обращаться к серверу и играть с ним по вышеуказанной стратегии:
```python
import websocket
import ssl
import json
ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
ws.connect("wss://sdbjkas_sasaaageyooo.ctf.sch9.ru/get-flag")
ws.send("init")
data = json.loads(ws.recv())["state"]
def xor(d):
x = 0
for v in d: x ^= v
return x
while sum(data) > 0:
x = xor(data)
print("XOR =", x)
print("SUM =", sum(data))
for i, v in enumerate(data):
if v ^ x <= v:
v = v - (v ^ x)
break
ws.send(json.dumps({"index": i, "value": v}))
print("->", {"index": i, "value": v})
data[i] -= v
recv = json.loads(ws.recv())
print("<-", recv)
if "msg" in recv.keys(): break
i = recv['index']
v = recv['value']
data[i] -= v
```
(за код спасибо @quforos)
Запускаем и через приблизительно минуту нам выдаётся флаг.