118 lines
3.4 KiB
Python
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)
|