Amazing
An important step towards the strong AI is the ability of an artificial agent to solve a well-defined problem. A project by the name 'amazing' was one of such test problems. It's still up...
nc amazing.2016.volgactf.ru 45678
So, what we have here is yet another task with lots of rounds to be completed in order to get the flag.
$ nc amazing.2016.volgactf.ru 45678 Find the way out! Use 'l\n', 'u\n', 'r\n' and 'd\n' to move left, up, right or down, respectively. You can also make more than a single move at a time, e.g. 'rrdlllddru\n' N.B. the very last symbol must be '\n' .Good luck! Round number 1 +---+---+---+---+---+---################################################################################################################################################# | * | ################################################################################################################################################# +---+ + + +---+---################################################################################################################################################# | | | | ################################################################################################################################################# + + + +---+---+ ################################################################################################################################################# | | | | | ################################################################################################################################################# + + + + + +---################################################################################################################################################# | | | | ################################################################################################################################################# + +---+---+ +---+ ################################################################################################################################################# | | | | ################################################################################################################################################# + + + +---+ +---################################################################################################################################################# | | | | ################################################################################################################################################# ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### ######################################################################################################################################################################### #########################################################################################################################################################################
Try to solve this by hand and eventually you'll get
Your decision making is too slowmessage.
I really hate when graph/field is defined with ASCII-art. It's OK when each character is one cell, but when cells are larger — with all these '|' and '-' walls — it drives me nuts.
That's why I didn't parse that field so I could use some DFS to find the exit. I just saved it all as Python's list of strings and was looking for '*' character in there. It is known that you can exit the maze by following the right wall. So that's exactly what I did. I remembered the last "direction" and was making a move to the first free cell (in "right" order).
That solution was working, but it was too slow. So, I've started doing this moves right in that list — by moving '*' character from cell to cell. When there is '#' character around, I was sending all the moves I did to the server.
Printing the whole field every step was fine for debug, but not really good for speed. I removed it and started waiting. After the round 300, I wasn't getting any output — my script was waiting for the next round and wasn't printing the flag server gave it.
I was actually streaming it live on Twitch (switching off the screencast when close to round 300):
So, I've started over — I thought it was a glitch at first. I've also modified the script to print what was received from server later and launched that too. So, that second try was as successful as the first one — nothing after the round 300. The third one was almost there — on round 274 — when organizers restarted the task.
After the restart server was answering very fast — and it also was asking to solve only 30 rounds. That's how I finally got the flag:
Congratulations! Your flag is: VolgaCTF{eurisco!}
So, that's the script:
#!/usr/bin/env python import time import sys, socket, struct s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("amazing.2016.volgactf.ru", 45678)) print(s.recv(1024).decode('utf-8')) last_wall = "l" def decide(lines, row, col, last_wall): where = "" left_free = False down_free = False right_free = False up_free = False PRINT_FREE = False if col>1 and lines[row][col-2] == ' ': if PRINT_FREE: print("no wall on the left") left_free = True if row<len(lines)-1 and lines[row+1][col] == ' ': if PRINT_FREE: print("no wall on the bottom (down)") down_free = True if col<len(lines[row])-2 and lines[row][col+2] == ' ': if PRINT_FREE: print("no wall on the right") right_free = True if row>0 and lines[row-1][col] == ' ': if PRINT_FREE: print("no wall on the top (up)") up_free = True if (col>1 and lines[row][col-2] == '#') or (row<len(lines)-1 and lines[row+1][col] == '#') or (col<len(lines[row])-2 and lines[row][col+2] == '#') or (row>0 and lines[row-1][col] == '#'): return ("", last_wall) if last_wall == "l": if left_free: where = "l" last_wall = "u" elif down_free: where = "d" last_wall = "l" elif right_free: where = "r" last_wall = "d" elif up_free: where = "u" last_wall = "r" else: print("AAAAAAAAAAAAAAAAA") elif last_wall == "d": if down_free: where = "d" last_wall = "l" elif right_free: where = "r" last_wall = "d" elif up_free: where = "u" last_wall = "r" elif left_free: where = "l" last_wall = "u" else: print("AAAAAAAAAAAAAAAAA") elif last_wall == "r": if right_free: where = "r" last_wall = "d" elif up_free: where = "u" last_wall = "r" elif left_free: where = "l" last_wall = "u" elif down_free: where = "d" last_wall = "l" else: print("AAAAAAAAAAAAAAAAA") elif last_wall == "u": if up_free: where = "u" last_wall = "r" elif left_free: where = "l" last_wall = "u" elif down_free: where = "d" last_wall = "l" elif right_free: where = "r" last_wall = "d" else: print("AAAAAAAAAAAAAAAAA") else: print("BBBBBBB") return (where, last_wall) def setv(field, r, c, v): field[r] = field[r][:c] + v + field[r][c+1:] def do_step(field, where, row, col): setv(field,row,col,' ') if where=="d": row+=2 if where=="u": row-=2 if where=="l": col-=4 if where=="r": col+=4 if not wereout(field, row, col): setv(field,row,col,'*') return (row, col) def print_field(field): for r in range(0, len(field)): print("{0:2}: {1}".format(r, field[r])) def wereout(field, mrow, mcol): return mrow<0 or mrow>len(field) or mcol<0 or mcol>len(field[0]) def walk(field, last_wall): mrow = -1 mcol = -1 w = len(field[0]) h = len(field) for r in range(0, h): for c in range(0, w): if field[r][c] == '*': mrow = r mcol = c break if mrow != -1: break if mrow == -1 or mcol == -1: sys.exit(0) WALKING_LEN = 500 seq = "" while len(seq)<WALKING_LEN: where, new_last_wall = decide(field, mrow, mcol, last_wall) if where == "": break mrow, mcol = do_step(field, where, mrow, mcol) seq += where last_wall = new_last_wall if mrow<0 or mrow>len(field) or mcol<0 or mcol>len(field[0]): break return seq, last_wall def get_field(last_wall): field_desc = "" while True: rcv = s.recv(4096) if rcv == None: break vd = rcv.decode('utf-8') for v in vd: sys.stdout.write(v) if field_desc=="" and v!="+": continue if len(field_desc) >= 2 and field_desc[-2:] == "\n\n": break field_desc += v if len(field_desc) >= 2 and field_desc[-2:] == "\n\n": break lines = field_desc.split('\n') return walk(lines, last_wall) while True: last_wall_was = last_wall a, last_wall = get_field(last_wall) print(a) sys.stdout.flush() s.send(a+"\n")
No comments:
Post a Comment