import socket
import json
import re
HOST = 'tasks.duckerz.ru'
PORT = 30009
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15.0)
s.connect((HOST, PORT))
def recv_until(marker):
"""Читает данные, пока не встретит маркер."""
data = b""
try:
while marker not in data:
chunk = s.recv(4096)
if not chunk:
break
data += chunk
except socket.timeout:
pass
return data.decode('utf-8', errors='ignore')
# 1. Получаем сообщение от Алисы
text = recv_until(b"Send to Bob:")
print(f"[*] Получено от Алисы:\n{text}\n")
# 2. Парсим JSON
match = re.search(r'\{.*\}', text)
if not match:
print("[-] JSON не найден")
exit()
alice = json.loads(match.group())
p = int(alice['p'], 16)
g = int(alice['g'], 16)
A = int(alice['A'], 16)
print(f"[*] p = {p} ({p.bit_length()} бит)")
print(f"[*] g = {g}")
print(f"[*] A (Alice) = {A}")
# 3. Генерируем свой ключ
c = 1337 # наш приватный ключ
C = pow(g, c, p) # наш публичный ключ
print(f"[*] Наш приватный ключ c = {c}")
print(f"[*] Наш публичный ключ C = {C}")
# 4. Отправляем Бобу наш ключ C (подменяем Алису)
# Пробуем разные форматы JSON
formats = [
({"C": C}, "C (int)"),
({"C": str(C)}, "C (str)"),
({"C": hex(C)}, "C (hex)"),
({"pub": C}, "pub (int)"),
({"key": C}, "key (int)"),
({"B": C}, "B (int)"),
]
for payload_dict, label in formats:
print(f"\n[*] Пробуем формат: {label}")
# Переподключаемся каждый раз (чистый старт)
s.close()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10.0)
s.connect((HOST, PORT))
text = recv_until(b"Send to Bob:")
match = re.search(r'\{.*\}', text)
if not match:
continue
alice = json.loads(match.group())
p = int(alice['p'], 16)
g = int(alice['g'], 16)
c = 1337
C = pow(g, c, p)
payload = json.dumps(payload_dict)
print(f" Отправляем: {payload[:80]}...")
s.sendall((payload + "\n").encode())
# Ждем ответ от Боба
try:
resp = s.recv(4096).decode('utf-8', errors='ignore').strip()
if resp:
print(f" [+] ОТВЕТ: {resp[:200]}")
# Если ответ похож на ключ Боба — мы нашли формат!
if '0x' in resp or resp.isdigit():
print(f"\n[!!!] Боб ответил! Формат найден: {label}")
print(f"[!!!] Ответ: {resp}")
break
else:
print(f" [-] Пусто")
except socket.timeout:
print(f" [-] Таймаут")
s.close()