Hackergame 2023

增加了不会玩的 LLM 题和 blockchain 题

只玩了两个钟,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 了,终于舒服了。

CC BY-NC-SA 4.0 License