From d8955c6be0a321aff3dd8c960b6c3b15c0828f81 Mon Sep 17 00:00:00 2001 From: "John E. Rollinson" Date: Wed, 27 Oct 2021 15:27:53 -0400 Subject: [PATCH] Fix solver failures in BinEx101 Adds more resilient socket code to continue reading from the socket until the newline are read. Fixes #25 --- examples/remote/make/solver/solve.py | 30 +++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) mode change 100644 => 100755 examples/remote/make/solver/solve.py diff --git a/examples/remote/make/solver/solve.py b/examples/remote/make/solver/solve.py old mode 100644 new mode 100755 index f82a2fc..7e0593e --- a/examples/remote/make/solver/solve.py +++ b/examples/remote/make/solver/solve.py @@ -1,8 +1,21 @@ #!/usr/bin/python3 +import argparse import socket +parser = argparse.ArgumentParser(description="solve script for 'BinEx101'") +parser.add_argument('--host', default="challenge", help="the host for the instance") +parser.add_argument('--port', type=int, default=5000, help="the port of the instance") +parser.add_argument('--print', action='store_true', help="print flag to stdout rather than saving to file") +args = parser.parse_args() + +def recv_until(sock, pattern): + response = sock.recv(4096).decode() + while len(response) < len(pattern) or response[-len(pattern):] != pattern: + response += sock.recv(4096).decode() + return response + target = 2**32 - 1 -print("target =", target) +# print("target =", target) p = 2 q = 0 while p*p < target: @@ -16,14 +29,17 @@ exit(-1) c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -c.connect(("challenge", 5000)) -c.recv(4096) +c.connect((args.host, args.port)) +recv_until(c, ":\r\n") c.sendall(("%d\n" % p).encode()) -c.recv(4096) +recv_until(c, ":\r\n") c.sendall(("%d\n" % q).encode()) -response = c.recv(4096).decode() +response = recv_until(c, "'\r\n") flag = response.split("'")[-2] -with open('flag', 'w') as f: - f.write(flag) +if args.print: + print(f"flag: {flag}") +else: + with open('flag', 'w') as f: + f.write(flag)