-
Notifications
You must be signed in to change notification settings - Fork 263
/
Copy pathtask.py
70 lines (60 loc) · 1.93 KB
/
task.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import os,random,sys,string
from hashlib import sha256
import SocketServer
import CompactFIPS202
from flag import FLAG
class Task(SocketServer.BaseRequestHandler):
def proof_of_work(self):
proof = ''.join([random.choice(string.ascii_letters+string.digits) for _ in xrange(20)])
digest = sha256(proof).hexdigest()
self.request.send("sha256(XXXX+%s) == %s\n" % (proof[4:],digest))
self.request.send('Give me XXXX:')
x = self.request.recv(10)
x = x.strip()
if len(x) != 4 or sha256(x+proof[4:]).hexdigest() != digest:
return False
return True
def recvhex(self, sz):
try:
r = sz
res = ''
while r>0:
res += self.request.recv(r)
if res.endswith('\n'):
r = 0
else:
r = sz - len(res)
res = res.strip()
res = res.decode('hex')
except:
res = ''
return res
def dosend(self, msg):
try:
self.request.sendall(msg)
except:
pass
def dohash(self, msg):
return CompactFIPS202.Keccak(1552, 48, bytearray(msg), 0x06, 32)
def handle(self):
if not self.proof_of_work():
return
self.request.settimeout(3)
self.dosend("first message(hex): ")
msg0 = self.recvhex(8000)
self.dosend("second message(hex): ")
msg1 = self.recvhex(8000)
if msg0!=msg1 and self.dohash(msg0) == self.dohash(msg1):
self.dosend("%s\n" % FLAG)
else:
self.dosend(">.<\n")
self.request.close()
class ForkingServer(SocketServer.ForkingTCPServer, SocketServer.TCPServer):
pass
if __name__ == "__main__":
HOST, PORT = '0.0.0.0', 10001
print HOST
print PORT
server = ForkingServer((HOST, PORT), Task)
server.allow_reuse_address = True
server.serve_forever()