sch9_ctf_3/tasks/sasaaageyooo/readme.md

2.1 KiB
Raw Blame History

Разбор таски Сасааагеёёё

Это отсылка на Атаку титанов. Чтобы забрать флаг, нужно выиграть в игру

sasaaageyooo.ctf.sch9.ru

Игра, которая дана на веб страничке называется ним (можно было найти это в поисковике). В интернете много статей по тому, как выигрывать в неё. Стратегия заключается в следующем: нужно чтобы после каждого твоего хода побитовый xor (побитовое исключающее или) количества элементов в кучках было равно 0.

Заметим, что всё взаимодействие с сервером происходит через WebSockets (можно увидеть в javascript страницы), тогда, давайте общаться с сервером напрямую, не через браузер (аналогичный код можно написать и в браузере конечно)

Давайте напишем код, который будет обращаться к серверу и играть с ним по вышеуказанной стратегии:

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)

Запускаем и через приблизительно минуту нам выдаётся флаг.