简单收集了一些资料,希望能对感兴趣的大佬们有所帮助
欢迎来到Blockchain方向!在CTF里,这个方向主要侧重于智能合约安全,题目的主要形式是提供题目合约,要求进行合约审计并且找到合约中的漏洞并利用它达成某一目的(比如修改solved变量),当然还有其它的类型,比如提供字节码然后进行EVM字节码逆向,然后再利用合约漏洞等。
目前智能合约的主流语言是Solidity,这个语言非常像C/C++的类,所以学过C/C++的话是很容易上手的,当然没学过的话也是很好入门的,毕竟很像C/C++,所以不用太担心Blockchain很难上手之类的,唯一的问题就是资料基本上是国外的,需要一定英语水平,不过有翻译这个也不是问题
那么我们现在就开始做准备吧~
1. 准备工作
- 首先,最最重要的!魔法(VPN)!因为其实Blockchain很多东西都在国外的网站,而且有些网站必须要用魔法才能登上去,所以这点是至关重要的!我个人现在使用的订阅URL是赔钱机场(要钱,不多,登录好像也要魔法,不过这个Croxy Network能用,但是不推荐长期使用,不一定安全,不过仅用于临时使用还是可以的),代理工具URL使用的是Clash Verge Rev,至于你们自己使用什么可以自行决定,但是一定要有魔法!!!
- 想进入Blockchain的世界,你必须需要一个钱包,现在其实有很多钱包插件,比如MetaMask(小狐狸),Phantom,Sui Wallet等,而且其实现在有很多不同的链,有些链需要专门的钱包,比如Solana链强制需要Phantom,Sui链需要Sui Wallet等,不过这两个链的语言(分别是Rust和Move)相比Solidity还是难入门一点的,所以其实MetaMask就可以满足大部分需求了,就是注意助记词和私钥一定不要外泄!
- 要编写代码,肯定需要一个IDE,这里编写Solidity合约最常使用的是Remix IDE,它支持本地的虚拟私链,同时可以利用Injected Provider和真实的链进行合约部署与交互
- 有了钱包,一定要有测试链的币,因为这些链上的代币是不需要钱的,而且和主网链(Mainnet)进行代码编译运行的机制一致,能做到最真实的模拟。
我个人最常使用的测试链是Sepolia Testnet,它的链ID(Chain ID)是11155111,所有的链和它的链ID都可以在ChainList找到,这个之后如果你想进行开发的话应该能用上。
回到获取测试链的币的问题,你需要找到水龙头(Faucet)去接水,这个是黑话,其实就是获取某个链的代币,拿我使用的Sepolia举例,Faucet Link上面有很多不同的水龙头,你可以自行去接水,不过我不是很推荐pk910,它给的多,但是它的证明机制是PoW(Proof-of-Work,工作量证明),说白了就是挖矿,如果你不想你的散热风扇轰鸣的话就别用(笑)
推荐使用Infura的水龙头,只需要注册一个账号,而且Infura的API在你使用Python/JavaScript进行Web3开发的时候是必要的;过去Alchemy不需要主网有真的钱,不过现在改了,要主网有钱了,对于咱这种穷逼就还是算了( - 如果你在真实链上进行了合约交互,那么你肯定需要一个区块链浏览器,这里推荐Etherscan,对于Sepolia测试链,将etherscan.io改成sepolia.etherscan.io即可
2. 基础资料
在Ethereum相关的链上进行合约开发/交互的话一共有三个语言可选:Solidity,语法类似C/C++;Vyper,语法类似Python;Yul,汇编语言,不过题目一般都是Solidity为主,所以我这里就只拿Solidity举例了
2.1 初识Web3
学习Blockchain,最起码得了解什么是Web3,因为区块链只是Web3的一个技术,只了解技术本身是不行的:Web3解释:互联网的未来 | MetaMask Learn
2.2 初识以太坊(Ethereum)
一般提到区块链大伙想到的都是比特币,但是智能合约是以太坊这边首先提出来的,所以学习智能合约的话也需要了解一些以太坊的知识:以太坊开发文档 | ethereum.org
2.3 Solidity基础语法了解
这里极度推荐Solidity by Example,它就好比Solidity的菜鸟教程,而且他们在Youtube还有账号,如果不会的可以看视频;不仅如此,如果你有充分的时间,我也很推荐Patrick Collins - YouTube的开发教程视频,推荐从他的JavaScript开发开始,因为大部分使用的是JavaScript进行交互而非Python,Python使用的Brownie-Ganache前段时间已经弃用了,现在多使用的是Hardhat,CTF里面很多都用的是Foundry,都是JavaScript开发,所以学习一点JavaScript绝非什么坏事,不过由于Solidity版本问题,如果你想跟着教程走但是合约语法迁移至当前最新的0.8的话,会比较痛苦,因为会踩很多坑(别问我为什么知道)
⚠⚠⚠ 刚刚说到Foundry,这里推荐一个网站:Home | Cyfrin Updraft,是Patrick Collins他们搞的一个网站,里面包含了区块链基础,Solidity基础,Foundry搭建与开发基础和进阶,还有一些额外的高级的教程,非常非常推荐(就是你得会点英文www)
如果想去论坛查找解决方案,我一般是在Stack Overflow和Ethereum Stack Exchange两个论坛里面找,基本都能找到
2.4 智能合约漏洞靶场
唯一真神Ethernaut,你能找到的绝大部分合约漏洞都在这个只有32题的闯关游戏里,至于题解外网有很多,搜一下就有,其实已经有人在B站搬运了绝大部分的闯关视频,本来我还想做一个系列的,后面想了想算了(
有些漏洞的利用可以深挖一下原理,能学到很多
2.5 紧跟时事
有关安全就一定要紧跟时事,首先要了解的就是EIPS | Ethereum Improvement Proposals,这些提案在未来的某天很有可能就会变成现实,比如2月份末进行的Cancun硬分叉中,EIP-6780: SELFDESTRUCT only in same transaction (ethereum.org)就被作为核心提案被实行,对大量基于selfdestruct()的可升级合约造成了影响
还有Solidity — Solidity 0.8.25 documentation (soliditylang.org),Solidity的官方文档,里面有着大版本的重大改动,可以从那里入手学习一些知识,不过推荐作为辅助资料配合着看
2.6 国外赛事
国外的CTF其实很多都有Blockchain方向,如果你有兴趣可以去复现一下,不过国外的比赛一般缺少官方Writeup,很多都是选手自己发的,所以这点可能需要你自己进行信息搜集了,不过一般不会太难找
2.7 附加资料
Solidity/EVM文章 - 登链社区 (learnblockchain.cn):登链社区,这个中文网站有着大量的以太坊相关的文章
Web3 Tutorials Overview (alchemy.com):Alchemy的Solidity教程,全英文,不过很详细,有些教程还很深,深入浅出
开始 | MetaMask Help Center 🦊♥️:小狐狸的帮助文章,里面的文章主要侧重于交易这方面的知识,可以略微了解一下,里面还有个区块链和以太坊的基础知识的文章,暂时没翻译,不过可以看看
Ethereum Unit Converter | Ether to Gwei, Wei, Finney, Szabo, Shannon etc. (eth-converter.com):单位转换器,懒人必备
Web3CTF:写这个指南的时候刚找到的链接,看了一眼,里面的东西很全,有一定基础了之后可以看看
blockthreat/blocksec-ctfs: A curated list of blockchain security Capture the Flag (CTF) competitions (github.com):包含了大量过去的CTF的Blockchain题的Writeup
app.dedaub.com/decompile:EVM字节码反汇编网站,相比ethervm.io好很多,现在查看伪代码好像要注册,不过不用钱
Search - EthKey:私钥和地址的查找网站,不过缺少搜索地址获取私钥的功能,只支持搜索私钥获取地址的功能
智能合约笔记 | 独奏の小屋 (hasegawaazusa.github.io):曹佬(qsdz)的博客,里面例子的代码语言基本上是Vyper
随想——智能合约 | 9C±Void’s Blog (cauliweak9.github.io):本菜鸡的博客,里面又臭又长,不如去看隔壁的Ethernaut题解博客(
3. 你的第一个合约…或许?
3.1 Remix本地虚拟链上的合约部署与交互
这里简单举一个使用Remix进行一个合约的部署和交互的例子吧~
新建文件什么的我就跳过了,Solidity文件的后缀是.sol,这里就取Hello_Solidity.sol这个名字吧
1 | // SPDX-License-Identifier: MIT |
然后我们写上这么一个合约,其中最上面的SPDX证书写MIT就行,pragma声明了Solidity的版本号,下面的就是我们的合约,名字叫Hello,而合约里面有一个函数,是一个公开的,返回一个内存区里的字符串的hello_sol()函数,pure代表它不会访问和修改合约里面的状态变量
接下来我们在最左侧的列表里面找到第4个选项,现在我们就可以部署在一个本地的虚拟链上了,点击这个Deploy就好了
不出意外的话你会在最下面的Deployed/Unpinned Contracts找到你刚部署好的合约,接下来你如果想调用合约里的hello_sol()函数,直接点击左边的那个按钮就行了
最后在左侧已经最下面的交易详情里面我们都能看到输出是字符串”Hello, Solidity!”
但是如果我们只有一个地址,以及对应的合约,我们又应该如何导入并交互呢?
比如我们现在这个Hello合约的地址是0xd9145CCE52D386f254917e481eB44e9943F39138
,那我们就只需要像下图这样操作就行了:
其中第一步需要你在右侧先打开对应的.sol文件并在右侧代码区显示
按照上面的步骤完成之后,你最下面的Deployed/Unpinned Contracts应该就能看到交互区了,接下来交互就和上面一样了
3.2 如何在真实的测试链上交互——以Sepolia为例
其实操作基本上和在本地链上差不多的,不过你得先在你的浏览器搞一个钱包插件,比如我用的小狐狸
还是在最左边那一栏第4个,我们这里选中Injected Provider - MetaMask(这里显示Phantom是因为我同时有安装Phantom)
如果你的钱包没登录/连接到网站,那么你的钱包会跳出来让你输入密码,输入完之后应该是这样(后面那个余额别管,我浏览器缓存有问题)
接下来就是点击Deploy,你的钱包应该会跳出来这样的页面:
确认之后你需要等一小会,当下面的交易详情区跳出交易详情的时候,你的这次交易就成功啦!剩下的交互/导入操作就和上面本地链的操作差不多啦
如果你进行部署/交互的时候,Remix预测到你这次交易会失败,那么会弹出一个警告:
比如这里,我在部署合约的时候让value变成了1 wei,但是合约的constructor(虽然我没写出来,但是它确实存在,只是为空而已)并没有被payable关键词修饰,所以部署合约的同时向合约转账是会报错的,所以上面的警告就说会出错,execution reverted,也就是执行回退了。你仍然可以发送交易,但是99%会失败,所以不如取消交易,看看是哪里出了问题
最后补充一点:
最左侧那栏第3个选项,你可以在这里选择你编译.sol文件使用的Solidity版本,同时如图片右下角所示,可以复制它的ABI和字节码(与一个合约进行交互只需要2个东西:ABI和地址)
那么现在你已经学会了Remix IDE的基础使用啦~~可喜可贺可喜可贺~~
4. Foundry环境的搭建与使用——使用Unix系统从源代码搭建 (Under Construction)
虽然Remix这样的云IDE非常容易上手而且好用,但是当前大多数人使用的Web3开发环境是Foundry,而且国外CTF比赛的Blockchain题解绝大部分使用的也是Foundry,所以还是希望各位尽量搞一个Foundry环境下来,即使这种CLI的工具乍看起来非常麻烦难上手
这里给一个Foundry的中文文档:安装 - Foundry 中文文档 (learnblockchain.cn),各位可以自行查看,当然你也可以去上面2.3提到的Cyfrin Updraft网站去看,有视频教程也有文字版教程
4.1 搞个虚拟机吧
无论你是使用VMWare,Virtual Box,还是使用Windows的WSL,总之你一定要搞一个Unix系统的环境,因为Foundry只支持Unix,你在Windows里面除了用WSL(本质上就是个Linux虚拟机) 就只能用Docker了
前段时间(该段编写时间2024.5.16)不就说了VMWare免费向个人开放使用了吗?可以搞一个啊,之后再去Ubuntu啊Kali啊的官网找个iso镜像或者打包好的vmdk就行了
如果您是Docker大神,欢迎自行查看文档学习如何使用Docker镜像,咱这种菜鸡真不会,搞完了能不能教教我o(TヘTo)
4.2 安装Foundry
安装Foundry其实有好几个方法,这个方法应该是比较快的一个(当然中文文档里面有),就是使用Foundryup
由于Foundry基于Rust,所以首先得搞个Rust在环境里面:rustup.rs - The Rust toolchain installer,它会根据你当前的环境判断你需要怎么执行去安装Rust
安装完成之后就可以安装Foundryup了,使用下面的命令:
1 | curl -L https://foundry.paradigm.xyz | bash |
安装完成之后直接在控制台输入foundryup
就可以了,安装完成之后你的Foundry应该就下好了,输入forge
的话应该会弹出一堆选项
温馨提示:记得给你的Linux换源,否则下载Foundryup和安装Foundry慢的要死(别问我为什么知道)
4.3 使用Foundry构建新项目
新建一个文件夹作为你的工作空间,然后cd到里面,我们之后就会用这个目录进行各种操作
首先我们可以先配置一下Git的用户名和邮箱,就是自己的Github的用户名和邮箱,因为我们直接初始化项目可能会遇到相关的错误
所以使用下面的命令:
1 | git config --global user.email "your_email" |
当然,如果forge init
失败了,尝试添加--force
参数以覆写所有和Git相关的错误
运行完成之后你的目录下应该会有这些文件和文件夹:
.github
:工作流文件lib
:存放所有引用的库,如果需要外部引用库需要拉到这里.script
:存放脚本的目录,部署合约或者和合约交互的时候就需要运行里面存放的脚本src
:存放源合约的目录,你写的所有合约都放在这里test
:存放用于测试的脚本,一般用于验证合约是否能够正常编译运行.gitignore
:使用Git上传项目到Github的时候,不会上传里面指定的文件和文件夹foundry.toml
:为Foundry提供配置参数
如果你确实在你的目录下面看到了这些东西,那么恭喜你,可以使用Foundry进行合约的部署和交互了!
温馨提示:运行forge init
的时候需要用到libwebkit2gtk-4.0-37
这个库,而有些Linux可能缺少这个库,因此你可能需要apt-get install
一下,当然apt
和aptitude
都行,不过可能还是有问题,直接跟着报错给的建议(我记得是什么--fix-broken install
之类的命令)运行一下命令就行了(错误原因好像就是这个库还有一个依赖要下)
4.4 合约的编译,运行与交互 (Under Construction)
温馨提示:有些Linux可能缺少libwebkit2gtk-4.0-37
这个库,你可能需要apt-get install
一下,当然apt
和aptitude
都行,不过可能还是有问题,直接跟着报错给的建议(我记得是什么--fix-broken install
之类的命令)运行一下命令就行了(错误原因好像就是这个库还有一个依赖要下)
- 本文作者: 9C±Void
- 本文链接: https://cauliweak9.github.io/2024/04/28/Blockchain-Guide/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!