Name: Anonymous 2008-10-02 6:14
Programming challenges; some of them quite tricky. (``MultLog'' has me stumped right now.)
import socket
import time
import struct
import random
import re
import shutil
USERNAME = '' # your username
PASSWORD = '' # your password
FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)])
def dumpString(src, length=16):
return
result = []
for i in xrange(0, len(src), length):
chars = src[i:i+length]
hex = ' '.join(["%02x" % ord(x) for x in chars])
printable = ''.join(["%s" % ((ord(x) <= 127 and FILTER[ord(x)]) or '.') for x in chars])
result.append("%04x %-*s %s\n" % (i, length*3, hex, printable))
print ''.join(result)
def recv_timeout(the_socket,timeout=0.5):
the_socket.setblocking(0)
total_data=[];data='';begin=time.time()
while 1:
#if you got some data, then break after wait sec
if total_data and time.time()-begin>timeout:
break
#if you got no data at all, wait a little longer
elif time.time()-begin>timeout*2:
break
try:
data=the_socket.recv(8192)
if data:
total_data.append(data)
begin=time.time()
else:
time.sleep(0.1)
except:
pass
return ''.join(total_data)
def amf_str(s):
return "\x02"+struct.pack(">H",len(s))+s
def amf_bool(b):
if (b):
return "\x01\x01"
else:
return "\x01\x00"
def amf_null():
return "\x05"
def amf_num(n):
return "\x00"+struct.pack(">d",n)
def amf_objstart():
return "\x03"
def amf_objend():
return "\x00\x00\x09"
def amf_objitem(name, obj):
objdat = ""
if (type(obj)==type("")):
objdat = amf_str(obj)
if (type(obj)==type(0)):
objdat = amf_num(obj)
if (type(obj)==type(0.0)):
objdat = amf_num(obj)
if (type(obj)==type(False)):
objdat = amf_bool(obj)
return struct.pack(">H",len(name))+name+objdat
def chunk_packet(p):
outp = ""
while(True):
p, q = p[128:], p[0:128]
outp += q
if (p==""):
return outp;
else:
outp += "\xc3"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.welcometothelist.com",8080))
s.settimeout(None)
# handshake
# print "handshake"
sending = "\x03"+''.join([chr(random.randint(0,255)) for x in xrange(1536)])
dumpString(sending)
s.send(sending)
r = recv_timeout(s,0.3)
dumpString(r)
sending = r[1:1537]
dumpString(sending)
s.send(sending)
# print "connect"
packet_data = amf_str("connect")
packet_data += amf_num(1)
packet_data += amf_objstart()
packet_data += amf_objitem("app", "thelist")
packet_data += amf_objitem("flashVer", "WIN 9,0,47,0")
packet_data += amf_objitem("swfUrl", "http://www.welcometothelist.com/TheLIST.swf")
packet_data += amf_objitem("tcUrl", "rtmp://www.welcometothelist.com:8080/thelist")
packet_data += amf_objitem("fpad", False)
packet_data += amf_objitem("audioCodecs", 615)
packet_data += amf_objitem("videoCodecs", 124)
packet_data += amf_objitem("videoFunction", 1)
packet_data += amf_objitem("pageUrl", "http://www.welcometothelist.com/")
packet_data += amf_objitem("objectEncoding", 0)
packet_data += amf_objend()
packet = "\x03\x00\x05\x39" + struct.pack(">L", len(packet_data))[1:] + "\x14" + "\x00\x00\x00\x00" + chunk_packet(packet_data)
s.send(packet)
dumpString(packet)
# ignore result, assume okay
dumpString(recv_timeout(s))
# print "login"
packet_data = amf_str("login")
packet_data += amf_num(3)
packet_data += amf_null()
packet_data += amf_str(USERNAME)
packet_data += amf_str(PASSWORD)
packet = "\x43\x00\x05\x39" + struct.pack(">L", len(packet_data))[1:] + "\x14" + chunk_packet(packet_data)
s.send(packet)
dumpString(packet)
dumpString(recv_timeout(s))
# print "start session"
packet_data = amf_str("startSession")
packet_data += amf_num(4)
packet_data += amf_null()
packet = "\x43\x00\x05\x39" + struct.pack(">L", len(packet_data))[1:] + "\x14" + chunk_packet(packet_data)
s.send(packet)
dumpString(packet)
dumpString(recv_timeout(s))
r = re.compile("public\\ class\\ (.*?)\\\\n")
r2 = re.compile('(\\{\\\"stat.*xecuteStatus\\\"\\})')
r3 = re.compile('fileContent\\"\\:\\"(.*)\\"\\},\\"command')
##################################################
for fileid in xrange(5):
# print "open file"
packet_data = amf_str("openFile")
packet_data += amf_num(5)
packet_data += amf_null()
packet_data += amf_num(fileid)
packet = "\x43\x00\x05\x39" + struct.pack(">L", len(packet_data))[1:] + "\x14" + chunk_packet(packet_data)
s.send(packet)
dumpString(packet)
contents = recv_timeout(s)
dumpString(contents)
challenge = r.findall(contents)[0].replace("{","").replace(" ","")
print str(fileid)+": "+ challenge
print "save and compile"
try:
f=open(challenge+".txt","r")
except IOError:
f=open(challenge+".todo.txt","w")
f.write(r3.findall(contents.replace("\xc3",""))[0].replace('\\"','"').replace("\\n","\n").replace("\\t","\t"))
f.close()
print "MISSING!"
break
packet_data = amf_str("saveAndCompile")
packet_data += amf_num(6)
packet_data += amf_null()
packet_data += amf_num(fileid)
packet_data += amf_str(f.read().replace("\n","\x0d"))
f.close()
packet = "\x43\x00\x05\x39" + struct.pack(">L", len(packet_data))[1:] + "\x14" + chunk_packet(packet_data)
s.send(packet)
dumpString(packet)
dumpString(recv_timeout(s))
print "run"
packet_data = amf_str("run")
packet_data += amf_num(7)
packet_data += amf_null()
packet = "\x43\x00\x05\x39" + struct.pack(">L", len(packet_data))[1:] + "\x14" + chunk_packet(packet_data)
s.send(packet)
dumpString(packet)
contents = recv_timeout(s)
dumpString(contents)
result = r2.findall(contents)[0].replace("\xc3","")
print result
if '"result":"false"' in result:
print "YOU FAIL IT!"
shutil.move(challenge+".txt",challenge+".fail.txt")
break
s.close()