CTF 区块链方向小白入门学习路线(自备)
只是给自己看的,ai生成的
适合对象:刚开始接触 CTF 区块链题、懂一点编程但不了解智能合约安全的同学。
学习目标:从“看不懂题”到能独立分析常见 Solidity / EVM / DeFi 类 CTF 题。
1. CTF 区块链方向学什么?
CTF 中的区块链题通常不是让你“炒币”或研究公链生态,而是考察:
-
智能合约基础
- Solidity 语法
- 合约部署、调用、转账
msg.sender、tx.origin、msg.valuefallback/receive- 合约之间如何交互
-
EVM 基础
- 以太坊虚拟机如何执行合约
- storage / memory / calldata
- ABI 编码
- 函数选择器
- gas 的基本概念
-
智能合约漏洞
- 重入攻击
- 整数溢出 / 下溢
- 权限控制错误
- 随机数预测
delegatecall滥用tx.origin钓鱼- selfdestruct 强制转账
- storage slot 覆盖
-
DeFi 安全基础
- ERC20 / ERC721
- AMM 交易所模型
- 价格预言机
- 闪电贷
- 价格操纵
-
链上交互工具
- Remix
- MetaMask
- Foundry
- Hardhat
- Web3.py / ethers.js
2. 推荐学习顺序
阶段 0:先补最小必要基础
如果你是小白,不建议一开始就啃黄皮书或 EVM opcode。先掌握这些:
- 什么是区块链
- 什么是账户地址
- 什么是私钥、公钥、签名
- 什么是交易
- 什么是智能合约
- 什么是 gas
- 什么是以太坊测试网 / 本地链
你需要能回答
- 合约和普通账户有什么区别?
msg.sender是谁?- 向合约转 ETH 会发生什么?
- 合约能不能主动执行代码?
结论:区块链 CTF 的核心不是“区块链理论”,而是“智能合约代码审计 + 漏洞利用”。
阶段 1:学习 Solidity 基础
先学 Solidity,不要一开始就学太深的 EVM。
必学语法
- 变量类型
uintbooladdressbytesstringmappingarray
- 函数可见性
publicexternalinternalprivate
- 状态变量和局部变量
- 构造函数
constructor - 修饰器
modifier - 继承
- 事件
event - 错误处理
requirerevertassert
重点理解
msg.sender
msg.value
tx.origin
address(this).balance
这些变量在 CTF 题里经常是突破口。
推荐练习
用 Remix 写几个小合约:
- 存钱合约
- 取钱合约
- 只有 owner 能调用的合约
- 简单 ERC20 代币
- 两个合约互相调用
阶段 2:学习基本链上交互
CTF 题通常会给你一个合约地址、RPC 地址、私钥或网页环境,你需要写脚本调用合约。
需要掌握的工具
| 工具 | 用途 | 建议程度 |
|---|---|---|
| Remix | 在线写和调试 Solidity | 必学 |
| MetaMask | 钱包、签名、切换网络 | 必学 |
| Foundry | 写 PoC、跑测试、部署合约 | 强烈推荐 |
| Hardhat | JS/TS 生态常用开发框架 | 可选 |
| Web3.py | Python 调用合约 | 推荐 |
| ethers.js | JavaScript 调用合约 | 推荐 |
小白建议
如果你喜欢 Python:
Solidity + Remix + Web3.py
如果你想走安全研究 / 审计方向:
Solidity + Foundry
Foundry 是现在区块链安全题和审计里非常常用的工具。
阶段 3:学习 EVM 和 ABI 基础
不要死背 opcode,先掌握 CTF 常用概念。
必须理解
-
ABI 编码
- 函数调用数据如何组成
- 函数选择器是什么
- 参数如何编码
-
storage / memory / calldata
storage:永久存储,上链memory:临时内存calldata:外部调用输入数据
-
storage slot
- 状态变量如何存在 slot 里
private变量并不是真的私密- mapping 的 slot 如何计算
-
合约调用方式
calldelegatecallstaticcalltransfersend
CTF 中常见考点
- 读 private 变量
- 构造特殊 calldata
- 绕过函数签名检查
- 利用
delegatecall修改调用者 storage - 使用合约绕过
isContract检查
3. 常见漏洞学习路线
下面这些漏洞建议按顺序学。
3.1 权限控制漏洞
常见问题
function changeOwner(address newOwner) public {
owner = newOwner;
}
没有检查调用者,任何人都能改 owner。
学习重点
onlyOwner- 初始化函数是否能重复调用
- owner 是否可能被覆盖
- proxy 合约是否初始化
CTF 常见形式
- 合约部署后忘记调用初始化
- 构造函数名字写错,变成普通函数
require(tx.origin == owner)被绕过
3.2 重入攻击 Reentrancy
经典场景
合约先转账,再更新余额:
function withdraw() public {
uint amount = balances[msg.sender];
require(amount > 0);
(bool ok, ) = msg.sender.call{value: amount}("");
require(ok);
balances[msg.sender] = 0;
}
攻击合约在收到 ETH 时再次调用 withdraw(),导致重复取钱。
学习重点
fallback/receive- Checks-Effects-Interactions 模式
- ReentrancyGuard
- 跨函数重入
- ERC777 hooks 重入
3.3 整数溢出 / 下溢
Solidity 0.8 以前,整数默认不会自动检查溢出。
uint8 x = 255;
x = x + 1; // 在旧版本中会变成 0
学习重点
- Solidity 版本差异
unchecked- SafeMath
- token balance 溢出
3.4 随机数预测
链上数据通常不能安全作为随机数。
危险写法:
uint random = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender))) % 100;
学习重点
block.timestamp可被一定程度操控block.number可预测blockhash有限制- mempool 中交易可被观察
3.5 tx.origin 漏洞
不要用 tx.origin 做权限判断。
危险写法:
require(tx.origin == owner);
攻击者可以诱导 owner 调用攻击合约,攻击合约再调用目标合约,此时 tx.origin 仍然是 owner。
正确做法
require(msg.sender == owner);
3.6 delegatecall 漏洞
delegatecall 会在调用者的上下文中执行被调用合约代码。
也就是说:
- 代码用的是别人的
- storage 改的是自己的
msg.sender不变msg.value不变
CTF 常见考点
- 修改 owner
- 覆盖 storage slot
- proxy 初始化漏洞
- library 地址被替换
3.7 selfdestruct 强制转账
即使目标合约没有 receive(),攻击者也可能通过 selfdestruct 强制给它转 ETH。
CTF 常见考点
require(address(this).balance == 0);
这类判断可能被强制转账破坏。
3.8 Private 不等于秘密
Solidity 里的 private 只是不允许其他合约直接访问,不代表链上数据不可见。
bytes32 private password;
这个 password 仍然可以通过读取 storage slot 得到。
4. 推荐靶场和题单
入门靶场
-
Ethernaut
- 地址:https://ethernaut.openzeppelin.com/
- 最经典的 Solidity 安全入门靶场
- 建议完整刷一遍
-
Damn Vulnerable DeFi
- 地址:https://www.damnvulnerabledefi.xyz/
- DeFi 安全经典练习
- 适合学完基础漏洞后刷
-
Capture the Ether
- 地址:https://capturetheether.com/
- 早期经典区块链 CTF 靶场
-
Paradigm CTF
- 地址:https://github.com/paradigmxyz/paradigm-ctf-2021
- 难度较高,适合进阶
-
QuillCTF
- 地址:https://quillctf.super.site/
- 智能合约安全练习题
5. 建议学习路线图
第 1 周:建立基本概念
目标:看懂最简单的合约。
任务:
- 了解以太坊账户、交易、gas
- 学 Solidity 基础语法
- 用 Remix 部署一个 HelloWorld 合约
- 写一个存钱 / 取钱合约
- 理解
msg.sender和msg.value
练习:
- Remix 部署合约
- 调用合约函数
- 给合约转 ETH
第 2 周:掌握合约交互
目标:能写攻击合约。
任务:
- 学习合约之间调用
- 学习
receive()和fallback() - 学习 ABI 和函数选择器
- 用 Web3.py 或 Foundry 调用合约
练习:
- 写一个合约调用另一个合约
- 写一个攻击合约触发 fallback
- 计算函数选择器
第 3 周:刷 Ethernaut
目标:掌握常见 CTF 基础漏洞。
推荐顺序:
- Hello Ethernaut
- Fallback
- Fallout
- Coin Flip
- Telephone
- Token
- Delegation
- Force
- Vault
- King
- Re-entrancy
- Elevator
- Privacy
- Gatekeeper One
- Gatekeeper Two
- Preservation
每题都要整理:
## 题目名
### 漏洞点
### 利用思路
### 关键代码
### 学到的知识
第 4 周:学习 Foundry
目标:能本地复现和写 PoC。
任务:
- 安装 Foundry
- 学会
forge init - 学会
forge test - 学会写 Solidity 测试
- 学会
vm.prank - 学会
deal - 学会 fork 主网 / 测试网
常用命令:
forge init demo
forge build
forge test -vvv
cast call <address> <function-signature>
cast send <address> <function-signature> --private-key <key>
cast storage <address> <slot>
第 5 周:进入 DeFi 安全
目标:能看懂简单 DeFi 题。
任务:
- 学 ERC20
- 学 AMM 模型
- 理解恒定乘积公式
x * y = k - 理解价格预言机
- 理解闪电贷
练习:
- Damn Vulnerable DeFi 前几题
- 简单 Uniswap V2 模型题
6. CTF 做题基本流程
拿到一道区块链题后,按这个流程分析。
第一步:读题目目标
常见目标:
- 让
isSolved()返回 true - 把合约余额清空
- 成为 owner
- 获得某个 token
- 让某个状态变量改变
先找类似代码:
function isSolved() public view returns (bool) {
return ...;
}
第二步:看合约版本
pragma solidity ^0.6.0;
pragma solidity ^0.8.0;
重点:
- Solidity < 0.8 可能有整数溢出
- 老版本构造函数、fallback 写法不同
- ABIEncoderV2 在老版本中可能有历史问题
第三步:找资产和权限
重点看:
owner
admin
balance
balances
token
withdraw
transfer
approve
思考:
- 谁能取钱?
- 谁能改 owner?
- 是否有初始化函数?
- 是否有权限检查遗漏?
第四步:看外部调用
重点找:
call
delegatecall
send
transfer
approve
transferFrom
onERC721Received
onERC1155Received
思考:
- 是否先转账后改状态?
- 是否可重入?
- 是否能调用恶意合约?
delegatecall是否能改 storage?
第五步:看随机数和时间
重点找:
block.timestamp
block.number
blockhash
keccak256
思考:
- 随机数是否可预测?
- 是否可以在同一笔交易中算出结果?
第六步:写 PoC
常见 PoC 方式:
- Remix 手动调用
- Foundry 写测试
- Web3.py 写脚本
- ethers.js 写脚本
建议优先用 Foundry,因为很多区块链 CTF 题可以直接写 Solidity 攻击合约和测试。
7. 常用检查清单
做题时可以逐项检查。
权限类
资金类
数据类
DeFi 类
8. 小白最容易踩的坑
只看 Solidity,不看交易流程
很多题的关键不在单个函数,而在调用顺序。
例如:
- 先部署攻击合约
- 调用目标合约
- 目标合约回调攻击合约
- 攻击合约再次调用目标合约
以为 private 真的是私密
链上所有 storage 都可以被节点读取。
不理解 msg.sender
如果 A 调用 B,B 里看到的 msg.sender 是 A。
如果用户调用攻击合约 A,A 再调用目标 B,B 里看到的 msg.sender 是 A,不是用户。
不会写攻击合约
很多题不能只靠手动点 Remix,需要写一个中间攻击合约。
没有本地复现
建议所有题都尽量本地写测试复现。只看 writeup 很容易以为自己懂了。
9. 推荐工具安装
Foundry
官网:https://book.getfoundry.sh/
安装后常用:
forge --version
cast --version
anvil --version
工具作用:
forge:编译、测试 Solidity 项目cast:命令行调用链上合约anvil:本地区块链节点
Node.js + Hardhat
适合 JS/TS 生态。
npm install --save-dev hardhat
npx hardhat init
npx hardhat test
Python + Web3.py
适合喜欢 Python 的同学。
pip install web3
简单调用示例:
from web3 import Web3
w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
print(w3.is_connected())
10. 推荐资料
官方文档
- Solidity 文档:https://docs.soliditylang.org/
- Foundry 文档:https://book.getfoundry.sh/
- OpenZeppelin 文档:https://docs.openzeppelin.com/
- Ethereum Developer Docs:https://ethereum.org/developers/
靶场
- Ethernaut:https://ethernaut.openzeppelin.com/
- Damn Vulnerable DeFi:https://www.damnvulnerabledefi.xyz/
- Capture the Ether:https://capturetheether.com/
- Paradigm CTF:https://github.com/paradigmxyz/paradigm-ctf-2021
安全参考
- SWC Registry:https://swcregistry.io/
- ConsenSys Smart Contract Best Practices:https://consensys.github.io/smart-contract-best-practices/
- OpenZeppelin Blog:https://blog.openzeppelin.com/
11. 建议的学习方式
不要只看教程,建议用下面这个循环:
学一个概念
↓
看一个简单漏洞例子
↓
自己写一遍漏洞合约
↓
自己写攻击合约
↓
用 Foundry 或 Remix 复现
↓
刷一道对应 CTF 题
↓
写笔记总结
每道题至少总结四点:
# 题目名
## 目标
题目要求我做到什么?
## 漏洞
合约哪里写错了?
## 利用
我如何利用这个错误?
## 修复
真实项目里应该怎么修?
12. 最小可行学习路线
如果你时间有限,按这个路线走:
Solidity 基础
↓
Remix 部署和调用合约
↓
msg.sender / msg.value / fallback / receive
↓
Ethernaut 前 15 题
↓
Foundry 基础
↓
重入、delegatecall、storage、ABI
↓
Damn Vulnerable DeFi 入门题
13. 学到什么程度算入门?
如果你能做到下面这些,就算区块链 CTF 入门了:
- 能看懂普通 Solidity 合约
- 能判断谁能调用某个函数
- 能写简单攻击合约
- 能解释重入攻击
- 能读 storage slot
- 能用 Remix 或 Foundry 复现漏洞
- 能独立完成 Ethernaut 前 10~15 题
- 能根据
isSolved()反推解题目标
14. 后续进阶方向
入门后可以继续学:
-
EVM opcode
- 反编译合约
- 字节码分析
- gas 优化题
-
Proxy 和升级合约
- Transparent Proxy
- UUPS
- storage collision
-
DeFi 攻击
- 闪电贷
- 价格操纵
- oracle attack
- sandwich attack
- MEV 基础
-
形式化验证和审计工具
- Slither
- Mythril
- Echidna
- Foundry fuzzing
-
真实链上攻击复盘
- The DAO
- bZx
- Harvest Finance
- Euler Finance
- Curve / Vyper 事件
15. 给小白的一句话建议
区块链 CTF 不要一开始追求“看懂所有 EVM 细节”。
最有效的入门方式是:
先学 Solidity,刷 Ethernaut,边刷边补 EVM 和 Foundry。
遇到题目时重点问自己三件事:
- 题目最终要我改变什么状态?
- 哪个函数能影响这个状态?
- 我能不能用合约调用、重入、delegatecall、storage、ABI 等方式绕过限制?
只要坚持复现和写 PoC,进步会非常快。

浙公网安备 33010602011771号