#!/usr/bin/env python2.6 import socket import re import time sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("ctf.phdays.com", 1165)) line = sock.recv(1024) username = line.strip().split(',')[1].strip() sock.sendall("%s\n"%(username)) model = [] moves = [] count = 1 def run(sock): global model global moves global count print(count) count = count +1 print("Wait for answer...") buff = "" last = False while True: line = sock.recv(1024) if not line: continue if "You win!" in line: exit(1) buff+=line if "Find" in line: if re.match(r".*\((\d+), (\d+), (\d+)\) and \((\d+), (\d+), (\d+)\):*",line.strip().split("\r\n")[-1]): break else: last = True elif last == True: break for line in buff.split("\r\n"): if "layer" in line: model.append([]) continue if "Find" in line: m = re.match(r".*?(\d+), (\d+), (\d+).*and.*?(\d+), (\d+), (\d+).*",line.strip()) start_layer, start_x, start_y = (int(m.group(1)),int(m.group(2)),int(m.group(3))) end_layer, end_x, end_y = (int(m.group(4)),int(m.group(5)),int(m.group(6))) break model[-1].append([]) for i in range(0, len(line.strip('\r\n')),2): value = line[i] if value == ' ': value = "1" model[-1][-1].append(value) model[end_layer][end_x][end_y] = "2" print("[DEBUG] Start (%s,%s,%s)"%(start_layer, start_x, start_y)) print("[DEBUG] Ende (%s,%s,%s)"%(end_layer, end_x, end_y)) search(start_layer, start_x, start_y) result ="" for a,b,c in reversed(moves): result +="(%s,%s,%s)"%(a,b,c) model[a][b][c] = "X" result += "(%s,%s,%s)"%(end_layer,end_x, end_y) model[end_layer][end_x][end_y] = "X" getkey(model) print("Sending result....") sock.sendall("%s\n"%(result)) model = [] moves = [] result="" def getkey(model): cur = layeror(model[0], model[1]) for i in range(3,len(model)): cur = layeror(cur, model[i]) printlayer(cur) print("########################################") def printlayer(layer): for i in range(len(layer)): print(" ".join(layer[i])) def layeror(layer1, layer2): resultlayer = [] for i in range(len(layer1)): resultlayer.append([]) for j in range(len(layer2)): resultlayer[i].append("X" if (layer1[i][j] =="X" or layer2[i][j]=="X") else " ") return resultlayer def search(layer,x,y): global model global moves if model[layer][x][y] == "2": return True elif model[layer][x][y] == "=": return False elif model[layer][x][y] == "3": return False model[layer][x][y] = "3" if ((layer < len(model)-1 and search(layer+1,x,y)) or (layer > 0 and search(layer-1,x,y)) or (x < len(model[0])-1 and search(layer,x+1,y)) or (x > 0 and search(layer,x-1,y)) or (y < len(model[0][0])-1 and search(layer,x,y+1)) or (y > 0 and search(layer,x,y-1))): moves.append((layer,x,y)) return True try: moves.remove((layer,x,y)) except: pass return False while True: run(sock) if __name__ == '__main__': pass