53 lines
2.1 KiB
Markdown
53 lines
2.1 KiB
Markdown
# Разбор таски Сасааагеёёё
|
||
|
||
> Это отсылка на Атаку титанов.
|
||
> Чтобы забрать флаг, нужно выиграть в игру
|
||
>
|
||
> 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)
|
||
|
||
Запускаем и через приблизительно минуту нам выдаётся флаг. |