Solver.py
import socket
import time
import string
HOST = '127.0.0.1'
PORT = 1337
FLAG_LENGTH = 32
ALPHABET = string.digits
def recv_until(sock, delimiter):
data = b""
while delimiter not in data:
chunk = sock.recv(1024)
if not chunk:
break
data += chunk
return data
def solve():
known_flag = ""
print(f"[*] Starting attack on {HOST}:{PORT}")
for i in range(FLAG_LENGTH):
found_digit = False
# print(f"[*] Brute forcing index {i} (Current flag: {known_flag})...")
for digit in ALPHABET:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
# Consume banner until prompt
recv_until(s, b"Enter your guess: ")
guess = known_flag + digit
s.sendall(guess.encode() + b"\\n")
# Read response
response = s.recv(4096).decode('utf-8', errors='ignore')
s.close()
# Debug print to verify we are seeing "Correct" or "Wrong"
# print(f"DEBUG: Guess '{digit}' -> '{response.strip()}'")
if "Correct flag!" in response:
known_flag += digit
found_digit = True
print(f"[+] Found digit {i+1}/{FLAG_LENGTH}: {digit} | Current: {known_flag}")
break
except ConnectionRefusedError:
print("[-] Connection refused. Server not up?")
return
except Exception as e:
print(f"[-] Error: {e}")
if not found_digit:
print("[-] Failed to find digit! logic error or wrong alphabet?")
print(f"Final partial flag: {known_flag}")
break
print(f"\\n[SUCCESS] Recovered Flag: {known_flag}")
if __name__ == "__main__":
solve()