Update 'tasks/sasaaageyooo/readme.md'
This commit is contained in:
parent
1e111f0bab
commit
fadf4f8c39
1 changed files with 44 additions and 1 deletions
|
@ -7,4 +7,47 @@
|
|||
|
||||
Игра, которая дана на веб страничке называется ним (можно было найти это в поисковике). В интернете много статей по тому, как выигрывать в неё. Стратегия заключается в следующем: нужно чтобы после каждого твоего хода побитовый 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)
|
||||
|
||||
Запускаем и через приблизительно минуту нам выдаётся флаг.
|
Loading…
Reference in a new issue