Repository navigation
Expand file tree
/
Copy pathserver.py
More file actions
55 lines (43 loc) · 1.53 KB
/
Copy pathserver.py
File metadata and controls
55 lines (43 loc) · 1.53 KB
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
import socketserver
import signal
import random
#from secret import pika, flag
class PRNG:
def __init__(self, a, b, nbits):
self.a = a
self.b = b
self.nbits = nbits
self.m = (1 << self.nbits)
self.state = random.randint(0, 1 << nbits)
def nextint(self):
self.state = ((self.a * self.state) + self.b) % self.m
return self.state >>(self.nbits - 128)
def challenge(req):
print "Client connected..."
prng = (PRNG(1021421335645363450,1034524350, 512))
req.sendall(b'Where is LCGatsu?\n')
while True:
try:
req.sendall(b'Choose a rock:\n')
tmp = int(req.recv(4096).decode().strip(),16)
real = prng.nextint()
if tmp == real:
req.sendall(b'Oh my god, there you are LCGatsu!\n')
exit(1)
else:
req.sendall(b'Nop, LCGatsu is not here.\nLast known position under rock: '+ hex(real).encode()+b'\n')
print "Real: {}".format(hex(real))
except:
req.sendall(b'Invalid input!\n')
exit(1)
class incoming(socketserver.BaseRequestHandler):
def handle(self):
signal.alarm(300)
req = self.request
while True:
challenge(req)
class ReusableTCPServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass
socketserver.TCPServer.allow_reuse_address = True
server = ReusableTCPServer(("0.0.0.0", 23333), incoming)
server.serve_forever()