{
"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+='%c | '%(bg, ' ')\n",
" html+=\"
\"\n",
" html+=\"
\"\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+='%c | '%(bg, d[i][j])\n",
" html+=\"
\"\n",
" html+=\"
\"\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": {}
}
]
}