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 安全, 区块链安全, 去中心化应用, 可编程交易块, 安全测试, 安全竞赛, 密码学挑战, 攻击性安全, 智能合约, 智能合约审计, 网空夺旗, 自动化攻击, 靶场