Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

welcometothelist.com

Name: Anonymous 2008-10-02 6:14

Programming challenges; some of them quite tricky. (``MultLog'' has me stumped right now.)

Name: Anonymous 2008-10-13 10:45

Put solutions each in ClassName.txt and run the following Python program.

(then your constraint becomes network latency; so best to run this in Sweden or even better on the same ISP as welcometothelist.com, iPeer)


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()

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List