Hackvent_2018/Day 13/decode.py
Roman Hergenreder 9236891cf1 Day 13
2018-12-13 13:54:10 +01:00

118 lines
3.4 KiB
Python

#!/usr/bin/python
import sys
import time
import socket
import _thread
import errno
import select
HOST = "whale.hacking-lab.com"
PORT = 4242
def getWallPos(text):
if len(text) > 22:
pos = text[21:]
index = pos.find(" ")
return index + 5 if index > 0 else -1
return -1
def getCursorPos(text):
pos = text.replace(" ", "")[27:29]
if len(pos) > 1 and not pos[1].isdigit():
pos = pos[0]
if pos.isdigit():
return int(pos)
return -1
wallPositions = [59, 34, 61, 42, 21, 20, 31, 38, 55, 40, 37, 50, 37, 42, 35, 52, 49, 40, 29, 54, 51, 56, 37, 30, 55, 34, 31, 20]
def play():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (HOST, PORT)
sock.connect(server_address)
sock.settimeout(2)
vel = 0
cursorPos = -1
wallPos = -1
wallAt = -1
key = ""
wallNum = -1
num = 0
while True:
data = sock.recv(128)
if len(data) > 0:
num += 1
if data[0] != 0xFF:
text = data.decode("utf-8").strip()
index = text.find("#")
if index >= 0 and index + 1 < len(text):
char = text[index+1]
if char.isalnum() or char == "-":
key += char
sys.stdout.write(text)
sys.stdout.flush()
newCurPos = getCursorPos(text)
newWallPos = getWallPos(text)
if newCurPos != -1:
vel = newCurPos - cursorPos
cursorPos = newCurPos
if newWallPos != -1:
wallPos = newWallPos
wallAt = num
wallNum += 1
if wallNum >= len(wallPositions):
wallPositions.append(wallPos)
if wallAt > -1 and num - wallAt >= 20:
wallPos = -1
wallAt = -1
if cursorPos != -1:
curWallKnown = wallPos != -1
nextWallKnown = wallPos == -1 and len(wallPositions) > wallNum + 1
if nextWallKnown:
nextWallPos = wallPositions[wallNum + 1]
else:
nextWallPos = wallPos
# We know the next wall:
if nextWallPos != -1:
leftBound = nextWallPos - 5
rightBound = nextWallPos + 5
if cursorPos >= leftBound and cursorPos <= rightBound and vel < 0:
sock.send(" ".encode("utf-8"))
elif cursorPos < leftBound:
sock.send(" ".encode("utf-8"))
# stay in the mid if we don't know the next wall
elif (not curWallKnown and not nextWallKnown and cursorPos < 50):
sock.send(" ".encode("utf-8"))
if num == 1:
sock.send(bytes.fromhex("fffd03fffb22fffa220301000003620304020f05000007621c08020409421a0a027f0b02150c02170d02120e02160f0211100213110000120000fff0fffd01"))
elif num == 2:
sock.send(bytes.fromhex("1b5b32343b3152"))
else:
return key
# HV18-9hYf-LSY1-hWdZ-496n-Mbda
key = ""
while len(key) < 29:
print("Known Walls:", wallPositions, "Key:", key)
time.sleep(5)
key = play()
print(key)