|
@@ -0,0 +1,117 @@
|
|
|
+#!/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)
|