{ "metadata": { "name": "", "signature": "sha256:58c82ce866eb2c99bd188e926f2d5bcbd56e6f69b36c7c06c4886855f649b717" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "# solution to Maze of HITCON 2014 CTF\n", "from telnetlib import Telnet\n", "import terminal\n", "from time import sleep\n", "from IPython.html import widgets # Widget definitions\n", "from IPython.display import display # Used to display widgets in the notebook" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "if \"map_mem\" not in globals():\n", " map_mem=dict()\n", "w=widgets.HTMLWidget()\n", "w2=widgets.HTMLWidget()\n", "def show_maze2():\n", " html =\"\"\n", " for i in range(-44,45):\n", " html+=\"\"\n", " for j in range(-44,45):\n", " mx,my = j, i\n", " bg = {'@': '#000', '.': '#fff', '':'#0f7' }[map_mem.get((mx,my), '')]\n", " html+=''%(bg, ' ')\n", " html+=\"\"\n", " html+=\"
%c
\"\n", " w2.value = html\n", " \n", "def show_maze(d): \n", " html =\"\"\n", " for i in range(9):\n", " html+=\"\"\n", " for j in range(9):\n", " try:\n", " mx,my = cx+j-4,cy+i-4\n", " bg = {'@': '#000', '.': '#fff', 'o':'#777' }[d[i][j]]\n", " if (mx,my) in dead:\n", " bg=\"#f00\"\n", " elif (mx,my) in old:\n", " bg=\"#0f0\" \n", " except:\n", " bg = \"#00f\"\n", " t = d[i][j]\n", " if t=='o': t='.'\n", " if t in \"@.\":\n", " if (mx,my) in map_mem:\n", " if map_mem[mx,my] != t:\n", " raise xxxxxx\n", " else:\n", " map_mem[mx,my] = t\n", " html+=''%(bg, d[i][j])\n", " html+=\"\"\n", " html+=\"
%c
\"\n", " w.value = html\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "progress = widgets.IntProgressWidget(value=0, max=1000)\n", "progress.set_css(\"background\", \"black\")\n", "progress.set_css(\"width\", \"800px\")\n", "term = terminal.Terminal(24, 80)\n", "X = Telnet(\"210.71.253.213\", 8473)\n", "r = X.read_until(\"..........\") \n", "term.write(r)\n", "term.dump()\n", "sleep(1)\n", "def new_pos(cx,cy, d):\n", " if d ==0:\n", " return cx, cy-1\n", " if d ==1:\n", " return cx+1, cy\n", " if d == 2:\n", " return cx, cy+1\n", " if d ==3:\n", " return cx-1, cy\n", "from collections import defaultdict\n", "junction = set()\n", "mem =defaultdict(int)\n", "display(w)\n", "display(progress)\n", "display(w2)\n", "direction = -1\n", "ds = \"ACBD\"\n", "rds = \"BDAC\"\n", "stack =[]\n", "old =set()\n", "if 'dead' not in globals():\n", " dead=set()\n", "cx, cy = 0,0\n", "IDLE = 0.05\n", "LOOPS = int(500/IDLE)\n", "UPDATE = int(25/IDLE)\n", "for cnt in range(LOOPS):\n", " sleep(IDLE)\n", " r = X.read_very_eager() \n", " term.write(r)\n", " d = term.dump()\n", " if cnt%3==0:\n", " show_maze(d)\n", " progress.value=int(cnt*1000./LOOPS)\n", " nbhd = [d[3][4], d[4][5], d[5][4], d[4][3]] \n", " while 1:\n", " direction +=1\n", " if direction >=4:\n", " break\n", " if nbhd[direction]=='.':\n", " nx,ny = new_pos(cx,cy,direction)\n", " if (nx,ny) not in old and (nx,ny) not in dead:\n", " break\n", " if direction == 4: \n", " old.add((cx,cy))\n", " dead.add((cx,cy))\n", " if len(stack)==0:\n", " show_maze2()\n", " break\n", " cx, cy, direction = stack.pop()\n", " X.write(\"\\x1b[%c\"%rds[direction])\n", " else:\n", " stack.append((cx,cy,direction))\n", " X.write(\"\\x1b[%c\"%ds[direction])\n", " old.add((cx,cy))\n", " cx,cy,direction=nx,ny,-1 \n", " if cnt%UPDATE==0:\n", " show_maze2()\n", "print \"done\" \n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "done\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }