From fadf4f8c392504e47dccc3e397fb3620eeba31f7 Mon Sep 17 00:00:00 2001 From: dragonmuffin Date: Mon, 28 Aug 2023 16:52:41 +0000 Subject: [PATCH] Update 'tasks/sasaaageyooo/readme.md' --- tasks/sasaaageyooo/readme.md | 45 +++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/tasks/sasaaageyooo/readme.md b/tasks/sasaaageyooo/readme.md index c83afd0..626de14 100644 --- a/tasks/sasaaageyooo/readme.md +++ b/tasks/sasaaageyooo/readme.md @@ -7,4 +7,47 @@ Игра, которая дана на веб страничке называется ним (можно было найти это в поисковике). В интернете много статей по тому, как выигрывать в неё. Стратегия заключается в следующем: нужно чтобы после каждого твоего хода побитовый xor (побитовое исключающее или) количества элементов в кучках было равно 0. -Давайте напишем код: \ No newline at end of file +Заметим, что всё взаимодействие с сервером происходит через 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) + +Запускаем и через приблизительно минуту нам выдаётся флаг. \ No newline at end of file