Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
goelp14
GitHub Repository: goelp14/easyctf-iv-problems
Path: blob/master/nosource/solve.py
671 views
1
#!/usr/bin/env python
2
from __future__ import print_function
3
4
import re
5
import json
6
import requests
7
from base64 import b64encode, b64decode
8
from bs4 import BeautifulSoup
9
10
HOST = 'http://localhost:3000'
11
USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'
12
13
def process_token(inp, init, soupify):
14
token = bytearray(b64decode(inp))
15
assert len(token) == 32
16
17
if soupify:
18
token[32-5:] = b'soupd'
19
20
k = init & 0xff
21
for i in range(len(token)):
22
k ^= token[i]
23
token[i] = k
24
return b64encode(token).decode()
25
26
27
def repeated_xor(a, b):
28
length = max(len(a), len(b))
29
out = bytearray()
30
for i in range(length):
31
ca = a[i % len(a)]
32
cb = b[i % len(b)]
33
out.append(ca ^ cb)
34
return out.decode()
35
36
37
def main():
38
jar = requests.cookies.RequestsCookieJar()
39
40
# first, extract token0
41
r = requests.get(HOST + '/')
42
jar.update(r.cookies)
43
s = BeautifulSoup(r.text, 'html.parser')
44
token0 = s.find(id='token')['value']
45
print('token0', token0)
46
47
# now process
48
token0 = process_token(token0, 0x20, False)
49
print(' >>> ', token0)
50
51
# now extract token1
52
r = requests.post(HOST + '/login',
53
cookies=jar,
54
data={'token': token0},
55
headers={'User-Agent': USER_AGENT})
56
jar.update(r.cookies)
57
s = BeautifulSoup(r.text, 'html.parser')
58
token1 = s.find(id='token')['value']
59
print('token1', token1)
60
61
# now process
62
token1 = process_token(token1, 20, True)
63
print(' >>> ', token1)
64
65
# now get source!!
66
jar.set('token', token1)
67
r = requests.get(HOST + '/login',
68
cookies=jar,
69
headers={'User-Agent': USER_AGENT})
70
71
# find flag
72
m = re.search(r"var f \= '(.*)';", r.text)
73
encoded_flag = m.group(1)
74
print('encoded_flag', encoded_flag)
75
76
# decode flag with key
77
flag = repeated_xor(b64decode(encoded_flag), b'hoo_hoo!')
78
print('flag', flag)
79
80
81
if __name__ == '__main__':
82
main()
83
84
85