sch9_ctf_3/tasks/sasaaageyooo/readme.md

53 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Разбор таски Сасааагеёёё
> Это отсылка на Атаку титанов.
> Чтобы забрать флаг, нужно выиграть в игру
>
> sasaaageyooo.ctf.sch9.ru
Игра, которая дана на веб страничке называется ним (можно было найти это в поисковике). В интернете много статей по тому, как выигрывать в неё. Стратегия заключается в следующем: нужно чтобы после каждого твоего хода побитовый xor (побитовое исключающее или) количества элементов в кучках было равно 0.
Заметим, что всё взаимодействие с сервером происходит через 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)
Запускаем и через приблизительно минуту нам выдаётся флаг.