CTF 区块链方向小白入门学习路线(自备)

只是给自己看的,ai生成的

适合对象:刚开始接触 CTF 区块链题、懂一点编程但不了解智能合约安全的同学。
学习目标:从“看不懂题”到能独立分析常见 Solidity / EVM / DeFi 类 CTF 题。


1. CTF 区块链方向学什么?

CTF 中的区块链题通常不是让你“炒币”或研究公链生态,而是考察:

  1. 智能合约基础

    • Solidity 语法
    • 合约部署、调用、转账
    • msg.sendertx.originmsg.value
    • fallback / receive
    • 合约之间如何交互
  2. EVM 基础

    • 以太坊虚拟机如何执行合约
    • storage / memory / calldata
    • ABI 编码
    • 函数选择器
    • gas 的基本概念
  3. 智能合约漏洞

    • 重入攻击
    • 整数溢出 / 下溢
    • 权限控制错误
    • 随机数预测
    • delegatecall 滥用
    • tx.origin 钓鱼
    • selfdestruct 强制转账
    • storage slot 覆盖
  4. DeFi 安全基础

    • ERC20 / ERC721
    • AMM 交易所模型
    • 价格预言机
    • 闪电贷
    • 价格操纵
  5. 链上交互工具

    • Remix
    • MetaMask
    • Foundry
    • Hardhat
    • Web3.py / ethers.js

2. 推荐学习顺序

阶段 0:先补最小必要基础

如果你是小白,不建议一开始就啃黄皮书或 EVM opcode。先掌握这些:

  • 什么是区块链
  • 什么是账户地址
  • 什么是私钥、公钥、签名
  • 什么是交易
  • 什么是智能合约
  • 什么是 gas
  • 什么是以太坊测试网 / 本地链

你需要能回答

  • 合约和普通账户有什么区别?
  • msg.sender 是谁?
  • 向合约转 ETH 会发生什么?
  • 合约能不能主动执行代码?

结论:区块链 CTF 的核心不是“区块链理论”,而是“智能合约代码审计 + 漏洞利用”。


阶段 1:学习 Solidity 基础

先学 Solidity,不要一开始就学太深的 EVM。

必学语法

  • 变量类型
    • uint
    • bool
    • address
    • bytes
    • string
    • mapping
    • array
  • 函数可见性
    • public
    • external
    • internal
    • private
  • 状态变量和局部变量
  • 构造函数 constructor
  • 修饰器 modifier
  • 继承
  • 事件 event
  • 错误处理
    • require
    • revert
    • assert

重点理解

msg.sender
msg.value
tx.origin
address(this).balance

这些变量在 CTF 题里经常是突破口。

推荐练习

用 Remix 写几个小合约:

  1. 存钱合约
  2. 取钱合约
  3. 只有 owner 能调用的合约
  4. 简单 ERC20 代币
  5. 两个合约互相调用

阶段 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 常用概念。

必须理解

  1. ABI 编码

    • 函数调用数据如何组成
    • 函数选择器是什么
    • 参数如何编码
  2. storage / memory / calldata

    • storage:永久存储,上链
    • memory:临时内存
    • calldata:外部调用输入数据
  3. storage slot

    • 状态变量如何存在 slot 里
    • private 变量并不是真的私密
    • mapping 的 slot 如何计算
  4. 合约调用方式

    • call
    • delegatecall
    • staticcall
    • transfer
    • send

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. 推荐靶场和题单

入门靶场

  1. Ethernaut

  2. Damn Vulnerable DeFi

  3. Capture the Ether

  4. Paradigm CTF

  5. QuillCTF


5. 建议学习路线图

第 1 周:建立基本概念

目标:看懂最简单的合约。

任务:

  • 了解以太坊账户、交易、gas
  • 学 Solidity 基础语法
  • 用 Remix 部署一个 HelloWorld 合约
  • 写一个存钱 / 取钱合约
  • 理解 msg.sendermsg.value

练习:

  • Remix 部署合约
  • 调用合约函数
  • 给合约转 ETH

第 2 周:掌握合约交互

目标:能写攻击合约。

任务:

  • 学习合约之间调用
  • 学习 receive()fallback()
  • 学习 ABI 和函数选择器
  • 用 Web3.py 或 Foundry 调用合约

练习:

  • 写一个合约调用另一个合约
  • 写一个攻击合约触发 fallback
  • 计算函数选择器

第 3 周:刷 Ethernaut

目标:掌握常见 CTF 基础漏洞。

推荐顺序:

  1. Hello Ethernaut
  2. Fallback
  3. Fallout
  4. Coin Flip
  5. Telephone
  6. Token
  7. Delegation
  8. Force
  9. Vault
  10. King
  11. Re-entrancy
  12. Elevator
  13. Privacy
  14. Gatekeeper One
  15. Gatekeeper Two
  16. 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 方式:

  1. Remix 手动调用
  2. Foundry 写测试
  3. Web3.py 写脚本
  4. ethers.js 写脚本

建议优先用 Foundry,因为很多区块链 CTF 题可以直接写 Solidity 攻击合约和测试。


7. 常用检查清单

做题时可以逐项检查。

权限类

资金类

数据类

DeFi 类


8. 小白最容易踩的坑

只看 Solidity,不看交易流程

很多题的关键不在单个函数,而在调用顺序。

例如:

  1. 先部署攻击合约
  2. 调用目标合约
  3. 目标合约回调攻击合约
  4. 攻击合约再次调用目标合约

以为 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. 推荐资料

官方文档

靶场

安全参考


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. 后续进阶方向

入门后可以继续学:

  1. EVM opcode

    • 反编译合约
    • 字节码分析
    • gas 优化题
  2. Proxy 和升级合约

    • Transparent Proxy
    • UUPS
    • storage collision
  3. DeFi 攻击

    • 闪电贷
    • 价格操纵
    • oracle attack
    • sandwich attack
    • MEV 基础
  4. 形式化验证和审计工具

    • Slither
    • Mythril
    • Echidna
    • Foundry fuzzing
  5. 真实链上攻击复盘

    • The DAO
    • bZx
    • Harvest Finance
    • Euler Finance
    • Curve / Vyper 事件

15. 给小白的一句话建议

区块链 CTF 不要一开始追求“看懂所有 EVM 细节”。

最有效的入门方式是:

先学 Solidity,刷 Ethernaut,边刷边补 EVM 和 Foundry。

遇到题目时重点问自己三件事:

  1. 题目最终要我改变什么状态?
  2. 哪个函数能影响这个状态?
  3. 我能不能用合约调用、重入、delegatecall、storage、ABI 等方式绕过限制?

只要坚持复现和写 PoC,进步会非常快。

posted @ 2026-06-12 08:52  _ljnljn  阅读(38)  评论(0)    收藏  举报