import socket
import json
import re
HOST = 'tasks.duckerz.ru'
PORT = 30009
def try_answer(answer_str, label):
"""Пробует отправить ответ и вернуть реакцию сервера."""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5.0)
try:
s.connect((HOST, PORT))
data = b""
while b"Send to Bob:" not in data:
chunk = s.recv(4096)
if not chunk:
break
data += chunk
# Отправляем JSON
payload = json.dumps({"answer": answer_str})
s.sendall((payload + "\n").encode())
resp = s.recv(4096).decode('utf-8', errors='ignore')
if resp:
print(f"[+] УСПЕХ с {label}! Ответ: {resp}")
return resp
except Exception as e:
pass
finally:
s.close()
return None
# Основной цикл
for attempt in range(10):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10.0)
s.connect((HOST, PORT))
data = b""
try:
while b"Send to Bob:" not in data:
chunk = s.recv(4096)
if not chunk:
break
data += chunk
except socket.timeout:
pass
text = data.decode('utf-8', errors='ignore')
match = re.search(r'\{.*\}', text)
if not match:
s.close()
continue
alice = json.loads(match.group())
p_str = alice['p']
g_str = alice['g']
A_str = alice['A']
print(f"\n[*] Попытка {attempt+1}")
print(f"[*] p = {p_str[:50]}...")
print(f"[*] g = {g_str}")
print(f"[*] A = {A_str[:50]}...")
# Варианты ответов
try:
p_int = int(p_str, 16)
g_int = int(g_str, 16)
A_int = int(A_str, 16)
candidates = [
(str(p_int), "p (dec)"),
(str(A_int), "A (dec)"),
(str(A_int ^ g_int), "A XOR g"),
(str(A_int - g_int), "A - g"),
(str(A_int % p_int), "A mod p"),
(p_str, "p (raw)"),
(A_str, "A (raw)"),
]
except:
candidates = [
(p_str, "p (raw)"),
(A_str, "A (raw)"),
]
# Пробуем
found = False
for ans, label in candidates:
s.close()
resp = try_answer(ans, label)
if resp:
found = True
break
if found:
break
s.close()
print("\n[*] Готово")