TyFarrington/SUI-Blockathon2026-CTF-Challenge

GitHub: TyFarrington/SUI-Blockathon2026-CTF-Challenge

Sui 链上 Move 智能合约安全 CTF 挑战集合,涵盖随机数漏洞、时间窗口、质押机制和 PvP 对抗等多种题型。

Stars: 0 | Forks: 0

# Sui CTF 欢迎参加 Sui 夺旗赛 (Capture the Flag)!本次 CTF 旨在测试并提升你对 Sui Move 智能合约、Sui 对象模型以及可编程交易块 的理解。 ## 目录 - [Sui CTF](#sui-ctf) - [目录](#table-of-contents) - [入门指南](#getting-started) - [创建此仓库的副本](#create-your-own-copy-of-this-repo) - [环境设置](#environment-setup) - [前置条件](#prerequisites) - [设置说明](#setup-instructions) - [获取测试积分](#getting-testing-credits) - [挑战](#challenges) - [结构](#structure) - [Moving Window 挑战](#moving-window-challenge) - [说明](#instructions) - [Merchant 挑战](#merchant-challenge) - [说明](#instructions-1) - [Lootboxes 挑战](#lootboxes-challenge) - [说明](#instructions-2) - [提示](#hints) - [Staking 挑战](#staking-challenge) - [说明](#instructions-3) - [Sabotage Arena 挑战 (PvP)](#sabotage-arena-challenge-pvp) - [说明](#instructions-4) # 入门指南 ## 创建此仓库的副本 1. 在该 GitHub 仓库页面的顶部,点击 **"Use this template"** 按钮(右上角)。 2. 选择 **"Create a new repository"**。 3. 为你的仓库命名,并**确保将其设置为 Public(公开)**。 4. 点击 **"Create repository"**。 5. 将你新创建的仓库克隆到本地计算机: ``` git clone cd ``` ## 环境设置 现在你有了自己的副本,接下来设置环境并创建一个用于与 Sui 区块链交互的密钥对。 ### 前置条件 - Node.js(建议 v18 或更高版本) - pnpm 包管理器 ### 设置说明 1. 导航到 `scripts` 目录: ``` cd scripts ``` 1. 安装依赖项: ``` pnpm install ``` 1. 生成并注资一个新的密钥对: ``` pnpm init-keypair ``` 这将生成一个新的 Ed25519 密钥对并将其保存到 scripts 目录下的 `keypair.json` 文件中。**请确保不要在任何生产环境中使用此密钥对。** ## 获取测试积分 如果你正在参加黑客马拉松或研讨会活动,请向你的 Sui 代表索取专用的水龙头(或查看赛道详情)。否则,请使用 [Sui 官方水龙头](https://faucet.sui.io/)。 你可以在 Sui Explorer 上查看你的账户和余额,地址为: ``` https://suiscan.xyz/testnet/account/{your-address} ``` # 挑战 **已部署的合约地址:** `0xd56e5075ba297f9e37085a37bb0abba69fabdf9987f8f4a6086a3693d88efbfd` **交易摘要:** `AL133Jj44NV9euC6RreY1gjGHmCMwqfTcuKn6bbrKGqY` 所有挑战都是位于 `contracts/` 目录下单个 `ctf` 包中的 Move 模块。 所有挑战彼此独立,可以按任何顺序完成! ### 结构 ``` contracts/ ├── Move.toml # Package: ctf └── sources/ ├── flag.move # Base flag module └── ... # Challenge modules will be added here ``` ## Moving Window 挑战 在滑动窗口(moving window)期间提取 flag。 ### 说明 1. 仔细检查 `[moving_window.move](./contracts/sources/moving_window.move)` 合约。 2. 确定窗口何时开启。 3. 在 `[scripts/src/moving_window.ts](./scripts/src/moving_window.ts)` 中实现你的解决方案。 4. 使用 `pnpm moving-window` 运行你的脚本以提取 flag。 ## Merchant 挑战 使用 USDC 代币购买 flag。 ### 说明 1. 仔细检查 `[merchant.move](./contracts/sources/merchant.move)` 合约。 2. 在测试网上获取 USDC 代币。 3. 在 `[scripts/src/merchant.ts](./scripts/src/merchant.ts)` 中实现你的解决方案。 4. 使用 `pnpm merchant` 运行你的脚本以提取 flag。 ## Lootboxes 挑战 打开战利品箱直到你获得 flag(几率为 1/100,000!)。 ### 说明 1. 仔细检查 `[lootboxes.move](./contracts/sources/lootboxes.move)` 合约。 2. 注意中奖几率:1/100,000。蛮力破解将花费数百美元的 Gas 费! 3. 你需要部署自己的 Move 合约才能高效解决此问题。 4. 在 `[exploit/](./exploit/)` 目录中创建你的利用合约。 5. 部署你的合约并反复调用,直到获胜。 ### 提示 阅读 [Sui 随机性文档](https://docs.sui.io/guides/developer/on-chain-primitives/randomness-onchain),特别是: - 关于 **“Use (non-public) entry functions”** 的部分 - 为什么存在 `#[allow(lint(public_random))]` 以及它允许什么 - 在这种情况下 **“composition attacks”** 意味着什么 **需要考虑的关键问题:** - `public` 函数和 `entry` 函数有什么区别? - 当一个函数是 `public` 时,其他 Move 模块可以用它做什么? - 如何有条件地中止交易以避免为失败的尝试支付 Gas 费? - 查看 `extract_flag()` 函数 - 当你在没有 flag 的 MaybeFlag 上调用它时会发生什么? **额外帮助:** - 如果你遇到 `PostRandomCommandRestrictions` 错误,请记住包含随机性的 PTB 对随机调用之后的命令有限制。 ## Staking 挑战 质押 SUI 代币以获得索取 flag 的权利。 ### 说明 1. 仔细检查 `[staking.move](./contracts/sources/staking.move)` 合约。 2. 了解质押要求:你必须至少质押 1 SUI 持续至少 1 周(168 小时)。 3. 在 `[scripts/src/staking.ts](./scripts/src/staking.ts)` 中实现你的解决方案。 4. 使用 `pnpm staking` 运行你的脚本以提取 flag。 ## Sabotage Arena 挑战 (PvP) 与其他玩家竞争,将你的护盾构建到阈值并索取 flag —— 同时在过程中破坏其他人。 ### 说明 1. 仔细检查 `[sabotage_arena.move](./contracts/sources/sabotage_arena.move)` 合约。 2. 使用 `[scripts/src/sabotage_arena.ts](./scripts/src/sabotage_arena.ts)` 注册、构建你的护盾并攻击对手。 3. 实现你的解决方案以达到护盾阈值并索取 flag。 **注意**:本 CTF 仅用于教育目的。生成的密钥对仅用于测试网,绝不应在主网或涉及真实资产的情况下使用。
标签:DApp, DeFi, Ed25519, GNU通用公共许可证, Layer1, MITM代理, Move, Move 语言, Node.js, OPA, pnpm, PTB, Solidity 替代, Sui, Sui CTF, Sui Move, Sui 对象模型, Web3 安全, 区块链安全, 去中心化应用, 可编程交易块, 安全测试, 安全竞赛, 密码学挑战, 攻击性安全, 智能合约, 智能合约审计, 网空夺旗, 自动化攻击, 靶场