Загрузка данных


import socket
import json
import re
import time

HOST = 'tasks.duckerz.ru'
PORT = 30009

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(60.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")

match = re.search(r'\{.*\}', text)
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 = {A}")

# Шаг 2: Генерируем свой ключ
c = 1337
C = pow(g, c, p)
print(f"[*] Наш c = {c}")
print(f"[*] Наш C = {C}")

# Шаг 3: Отправляем Бобу C (подменяем Алису) в полном формате
payload_bob = json.dumps({
    "p": hex(p),
    "g": hex(g),
    "A": hex(C)
})
print(f"[*] Отправляем Бобу: {payload_bob[:100]}...")
s.sendall((payload_bob + "\n").encode())

# Шаг 4: Получаем ответ Боба
text2 = recv_until(b"Send to Alice:")
print(f"\n[*] Получено от Боба:\n{text2}\n")

# Извлекаем B
match_b = re.search(r'\{.*\}', text2)
if not match_b:
    print("[-] Не удалось найти сообщение от Боба")
    exit()

bob = json.loads(match_b.group())
B = int(bob['B'], 16)
print(f"[*] B (Bob) = {B}")

# Шаг 5: Вычисляем общий секрет
S = pow(B, c, p)
print(f"[*] Общий секрет S = {S}")

# Шаг 6: Отправляем Алисе наш C (подменяем Боба)
payload_alice = json.dumps({
    "p": hex(p),
    "g": hex(g),
    "B": hex(C)
})
print(f"\n[*] Отправляем Алисе: {payload_alice[:100]}...")
s.sendall((payload_alice + "\n").encode())

# Шаг 7: Читаем дальнейшие сообщения (выражение для решения)
print("[*] Читаем следующие сообщения...")
s.settimeout(15.0)
try:
    while True:
        resp = s.recv(4096)
        if not resp:
            print("[-] Соединение закрыто")
            break
        decoded = resp.decode('utf-8', errors='ignore')
        print(f"[+] Ответ: {decoded}")
        
        if "DUCKERZ{" in decoded:
            print(f"\n[!!!] ФЛАГ: {decoded}\n")
            break
        
        # Ищем выражение
        expr_match = re.search(r'(\d+[\+\-\*\/]\d+)', decoded)
        if expr_match:
            expr = expr_match.group()
            result = eval(expr)
            print(f"[*] Найдено выражение: {expr} = {result}")
            # Отправляем ответ
            payload_ans = json.dumps({"answer": result})
            s.sendall((payload_ans + "\n").encode())
            print(f"[*] Отправлен ответ: {payload_ans}")
except socket.timeout:
    print("[-] Таймаут")

s.close()