#!/usr/bin/env python3 """Solve a live The Last Bitbender instance.""" import os import re import socket from decrypt_stage import transform HOST = os.environ.get("HOST", "34.2.22.80") PORT = int(os.environ.get("PORT", "30083")) def recv_until(sock: socket.socket, marker: bytes) -> bytes: data = bytearray() while marker not in data: block = sock.recv(4096) if not block: break data.extend(block) return bytes(data) def main() -> None: token = os.environ.get("CTFD_TOKEN") if not token: raise SystemExit("set CTFD_TOKEN to your COMPFEST CTFd access token") with socket.create_connection((HOST, PORT), timeout=10) as sock: sock.settimeout(15) recv_until(sock, b"CTFd access token: ") sock.sendall(token.encode() + b"\n") challenge = recv_until(sock, b"response:") request = bytes.fromhex(re.search(rb"request: ([0-9a-f]{32})", challenge).group(1).decode()) response = transform(request).hex().encode() sock.sendall(response + b"\n") result = bytearray() while True: try: block = sock.recv(4096) except TimeoutError: break if not block: break result.extend(block) print(result.decode().strip()) if __name__ == "__main__": main()