只玩了两个钟,800 分,所以也只能随便写个 wp。
Hackergame 启动
改 query 参数即可。
更深更暗
js 里有一段生成 flag 的代码,直接提取调用即可。
赛博井字棋
比赛中没做出来,后来知道了是可以下在 AI 下过的地方。
下面是一段脚本(完赛后才完善的脚本):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import requests
URL = "http://202.38.93.111:10077/"
TOKEN = "your token"
session = requests.session()
session.get(URL, params={"token": TOKEN})
session.headers["Content-Type"] = "application/json"
session.post(URL, json={"act": "reset"})
resp = session.post(URL, json={"act": "getBoard"})
print("board:", resp.json())
resp = session.post(URL, json={"x": 0, "y": 0})
print("board:", resp.json())
resp = session.post(URL, json={"x": 1, "y": 1})
print("board:", resp.json())
resp = session.post(URL, json={"x": 2, "y": 2})
print("board:", resp.json())
|
需要注意的是每次 post 都会导致 session 变化,所以不能直接使用 session 容易使 set-cookie 无效,使用 token 获取 session 即可。
组委会模拟器
调 f12 看网络请求,大体逻辑梳理一下,写出了下面脚本:
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
|
import httpx
import asyncio
import datetime
import time
import re
async def delete(
session: httpx.AsyncClient, msg_id: int, delay: float
) -> httpx.Response:
await asyncio.sleep(delay)
return await session.post(
"/api/deleteMessage",
json={"id": msg_id},
headers={"Content-Type": "application/json"},
)
async def main():
session = httpx.AsyncClient()
# session.get(URL, params={"token": TOKEN})
session.cookies.set(
"session",
"your session",
)
session.base_url = "http://202.38.93.111:10021"
resp = await session.post("/api/getMessages")
if resp.status_code != 200:
raise RuntimeError
messages = resp.json()
messages, server_st = (
messages["messages"],
datetime.datetime.fromisoformat(messages["server_starttime"]),
)
server_st = server_st.replace(tzinfo=None)
start_delay = (server_st - datetime.datetime.utcnow()).total_seconds()
print("delaying", start_delay)
time.sleep(start_delay + 0.5)
deleting_tasks: set[asyncio.Task[httpx.Response]] = set()
async with asyncio.TaskGroup() as tg:
for msg_id, msg in enumerate(messages):
if re.search(r"hack\[[a-z]*\]", msg["text"]):
task = tg.create_task(delete(session, msg_id, msg["delay"]))
deleting_tasks.add(task)
done = True
for task in deleting_tasks:
res = task.result().json()
if not res["success"]:
print(res["error"])
done = False
if done:
resp = await session.post("/api/getflag")
print(resp.json())
asyncio.run(main())
|
我写的这个脚本应该是全网最完善的了,根据 server_time 开始计算,异步请求。
Git? Git!
熟悉 git 的人都知道有悬空 commit,用 git fsck --lost-found
命令查看就可以了,然后 checkout 在工作区里面 find 一下就可以看到 flag。
Others
还有其他一些小题,我就不写了。
blockchain 虽然我也有所研究,但是对 solidity 研究不深,涉及 ERC 和各种安全合约真的很复杂,所以基本没看。
后记
hugo 终于添加了 timeZone support,再也不用 --buildFuture
了,终于舒服了。