简单收集了一些资料,希望能对感兴趣的大佬们有所帮助
欢迎来到Blockchain方向!在CTF里,这个方向主要侧重于智能合约安全,不过同时还包含对ZK算法漏洞的攻击,EVM安全等,题目的一种主要形式是提供题目合约,要求进行合约审计并且找到合约中的漏洞并利用它达成某一目的(比如修改solved变量),当然还有其它的类型,比如提供字节码然后进行EVM字节码逆向,然后再利用合约漏洞等。
目前比较主流的语言有Ethereum Mainnet链下的Solidity智能合约语言,Vyper智能合约语言以及底层汇编语言Yul,除此之外还有Sui链使用的Move语言,以及开发Solana链使用的Rust
下面的内容着重于Solidity,这个语言非常像C/C++的类(当然也有说像Java/Javascript/Typescript的),所以学过C/C++的话是很容易上手的,当然没学过的话也是很好入门的,毕竟很像C/C++,所以不用太担心Blockchain很难上手之类的,唯一的问题就是资料基本上是国外的,需要一定英语水平,不过有翻译这个也不是问题
那么我们现在就开始做准备吧~
本文大部分于2024年编写,本人于2025年8月21日进行最后一轮翻新,但是只进行补充(因为我懒),因此如果有与实际情况不匹配的,敬请谅解
1. 准备工作
首先,最最重要的!魔法(VPN)!因为其实Blockchain很多东西都在国外的网站,而且有些网站必须要用魔法才能登上去,所以这点是至关重要的!我个人现在使用的订阅URL是赔钱机场(要钱,不多,登录好像也要魔法,不过这个Croxy Network能用,但是不推荐长期使用,不一定安全,不过仅用于临时使用还是可以的),代理工具URL使用的是Clash Verge Rev,至于你们自己使用什么可以自行决定,但是一定要有魔法!!!
想进入Blockchain的世界,你必须需要一个钱包,现在其实有很多钱包插件,比如MetaMask(小狐狸),Phantom,Sui Wallet等,而且其实现在有很多不同的链,有些链需要专门的钱包,比如Solana链对应的Phantom,Sui链对应的Sui Wallet等,不过其实MetaMask就可以满足大部分需求了,就是注意助记词和私钥一定不要外泄!
要编写代码,肯定需要一个IDE,对于新手,编写Solidity合约推荐使用Remix IDE,它支持本地的虚拟私链,同时可以利用Injected Provider和真实的以太坊节点交互来进行合约部署与交互
有了钱包,可以搞点公共测试链的币,因为这些链上的代币是不需要钱的,而且和主网链(Mainnet)进行代码编译运行的机制一致,能做到最真实的模拟。
我个人最常使用的测试链是Sepolia Testnet,它的链ID(Chain ID)是11155111,所有的链和它的链ID都可以在ChainList找到,这个之后如果你想进行开发的话应该能用上。
回到获取测试链的币的问题,你需要找到水龙头(Faucet)去接水,这个是黑话,其实就是获取某个链的代币,拿我使用的Sepolia举例,Faucet Link上面有很多不同的水龙头,你可以自行去接水现在绝大部分的水龙头需要你在主网上有交易记录或者资金,目前一个能相对稳定获取测试币的水龙头是pk910,因为它是通过PoW进行接水的,也就是说你想接水得用你的CPU挖
如果你在真实链上进行了合约交互,那么你肯定需要一个区块链浏览器,这里推荐Etherscan,对于Sepolia测试链,将etherscan.io改成sepolia.etherscan.io即可
2. 基础资料
在Ethereum相关的链上进行合约开发/交互的话一共有三个语言可选:Solidity,语法类似C/C++;Vyper,语法类似Python;Yul,汇编语言,Solidity和Vyper作为题目语言都有很多,我这里就只拿Solidity举例,比较好上手,学习Vyper可以跟着曹佬博客走,下面会给链接
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(ethers.js等)还是Python(web3py等),取决于你想搞前端还是后端的开发,实际上两者在和区块链交互上的操作其实差不多,可以触类旁通
同时强烈推荐一个网站:Home | Cyfrin Updraft,是Patrick Collins他们搞的一个网站,里面包含了区块链基础,Solidity基础,Foundry搭建与开发基础和进阶,还有一些额外的高级的教程,非常非常推荐(就是你得会点英文www)
有问题的话可以多问问9C,不太清楚曹佬有没有时间,不过一般他看到都是尽量解答的,如果想去论坛查找解决方案一般是在Stack Overflow和Ethereum Stack Exchange两个论坛里面找
2.4 智能合约漏洞靶场
唯一真神Ethernaut,你能找到的绝大部分合约漏洞都在这个闯关游戏里,至于题解外网有很多,搜一下就有,其实已经有人在B站搬运了绝大部分的闯关视频,本来我还想做一个系列的,后面想了想算了( (好消息,我还真做了,没人看www)
除此之外还有DeFiVulnLabs,他们的漏洞种类会多一些,同时同个组织的DeFiHackLabs还总结了历史上的DeFi合约攻击事件(会实时更新),如果对基础漏洞已经有所了解了可以尝试复现一下
当然还有很多比赛,你们自己搜一下Blockchain CTF
,有好几个Github repo都有统整,你们可以自己去看
P.S. 有些漏洞的利用可以深挖一下底层原理,能学到很多东西
2.5 紧跟时事
此部分写于24年,我懒得改了,总之意思就是Keep up —— by Cauliweak9 on 2025.8.21
有关安全就一定要紧跟时事,首先要了解的就是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,很多都是选手自己发的,所以这点可能需要你自己进行信息搜集了,不过一般不会太难找
举点例子:
- 2021~2023年的ParadigmCTF(他们的区块链靶机框架至今仍被大量比赛使用,包括你深的靶机也是魔改的他们的)
- 2023~2024年的BlazCTF
- 2024年的EthernautCTF(是的,就是OpenZeppelin搞的)
- 2025年的RemedyCTF(我本人从这次比赛里面学到的最多,实际上你深靶机魔改的是Remedy的,不过Remedy又是改的Paradigm的,所以…)
- etc.
上面是Blockchain为主要题目类型的CTF,目前国外的CTF很多都有Blockchain方向,包括但不限于SekaiCTF,justCTF,smileyCTF,DiceCTF等,各位感兴趣可以自行搜集资料
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)

需要注意的是,有的时候你的Metamask网络可能是其它的网络,比如说是主网,这个时候点击Metamask插件的左上角那个图标修改网络
如果你的钱包没登录/连接到网站,那么你的钱包会跳出来让你输入密码,输入完之后应该是这样(后面那个余额别管,我浏览器缓存有问题)
接下来就是点击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
之类的命令)运行一下命令就行了(错误原因好像就是这个库还有一个依赖要下)请注意:想下载
libwebkit2gtk-4.0-37
,你可能还需要安装或更新下面的几个前置依赖库:libjavascriptcoregtk-4.0-18_2.43.3-1
,libicu74
,libc6
,libjpeg8
,libjpeg-turbo8
4.4 合约的编译,运行与交互 (Under Construction)
4.4.1 合约的编译
我们假设你已经在你的src
目录下编写好了你自己的合约,比如说下面这个简单的合约,里面包含一个返回值42的函数:
1 | // SPDX-License-Identifier: UNLICENSED |
那么此时我们回到总目录下,在终端输入forge build
或者forge compile
,此时Foundry就会开始编译你的合约,最后会在out/(filename)/
下得到一个json文件,里面就是合约编译之后的东西,里面包含了合约ABI等相关信息
那么编译完成之后就可以尝试部署它了
4.4.(1.5) 前置知识:RPC URL与合约部署本质
如果你有尝试过使用Remix将你的合约部署到测试链甚至主链上,你会发现Metamask会弹出来让你设置信息并签名部署,但是Metamask又是如何知道这个交易要发送到哪条链上的呢?
此时打开Metamask的设置,找到网络那一栏,你会看到这样的东西:

右侧你就会看到RPC URL,而这就是我们每次发送交易的时候API调用将发送到的地方
每一个区块链节点都有一个与之对应的RPC URL,而你的交易信息发送到RPC之后就会通过节点发送到链上,所以链和RPC属于一对多的关系,不过如果你搭的是私链,那大部分情况你的RPC是只有1个的,因为你的私链只有1个节点正在运作
与此同时,链ID也是一个分辨你在和什么链交互的重要信息,这个也是不能填错,比如Ethereum Mainnet的ID是1,Sepolia Ethereum Testnet的是11155111,Anvil本地链的是31137等,Anvil的我们过会儿会用上
因此如果你发现题目给了RPC,那么你可以在Metamask添加网络,就把上面图片右侧的信息填充一下就好了
4.4.2 将合约部署到本地链
在部署合约之前,让我们首先简单学习一下Anvil的使用:
4.4.2.0 anvil
创建本地私链
命令就是朴实无华的anvil
:

上面给出的是生成的钱包中可用的(有钱的)账户地址,接下来的是每个地址对应的私钥,至于后面的…

Mnemonic是生成钱包时使用的助记词,Derivation Path是恢复路径,入门你只需要知道Mnemonic就行
Chain ID是Anvil生成的链的ID
Base Fee和Gas Limit都是和交易消耗的gas有关的值,这里不展开讲;最后的Genesis Timestamp是指创世块生成的时间戳(人话:区块链什么时候创建的)
最后就是Anvil监听的IP和端口,整体还是很显而易见的,下面给出一些常见的选项:
--host
:选定监听的IP,常用的如--host 0.0.0.0
,即全局监听--port
:选定监听的端口,默认为8545--mnemonic
:自定义生成钱包时使用的助记词,会生成不同的地址,当然可以使用--mnemonic-random 12
随机生成12词助记词进行钱包创建--balance
:自定义钱包内每个地址的初始余额,默认10000--fork
:创建指定RPC对应的链的分叉--hardfork
:指定区块链的硬分叉版本
剩下的就请各位自行探索吧~
4.4.2.1 forge create
Forge进行合约部署有两种方式,下面会依次介绍
使用Forge的create
命令就可以实现合约部署的功能,具体命令如下:
1 | forge create ContractName --rpc-url RPC_URL --interactive |
之后在终端输入你的账户私钥就可以了,当然你也可以使用--private-key PrivateKey
而不是--interactive
,比如下面这张图:

这里的RPC是Anvil的本地链RPC,其实RPC参数可以省去,因为forge create
的默认RPC就是这个,但是此处为了让各位更直观理解就打上去了
但是注意一点:永远永远不要将你有实际资产的账户的私钥在明文状态下使用,不然被偷走了就是另一个故事了
此时查看你的本地链,应该会有交易产生,比如我这里的Anvil:

4.4.2.2 forge script
前面只能进行合约的简单部署,但是如果我还想执行一些其它的操作呢?那岂不是太麻烦了?没事,Forge有个更客制化的命令script
帮你解决这个问题
当然,既然是script
,那肯定得写脚本吧,这里给一个例子:
1 | // SPDX-License-Identifier: UNLICENSED |
可以看到Forge Script实际上还是一个合约,只是我们需要使用vm.startBroadcast
去将交易广播到链上而已,合约部署就被简化为一个new
关键字创建新合约的操作了
一般我们会将Forge Script的文件后缀改为.s.sol
,因此这个脚本我们假设它的名字是Deploy.s.sol
,在Foundry项目的/script/
目录下,我们会执行:
1 | forge script script/Deploy.s.sol:Deploy --rpc-url $RPC_URL --broadcast -vvvv --interactives 1 |
这里的-vvvv
对应的是日志输出的完整度(4*Verbose,最高为5个v),而--interactives 1
会在部署的时候弹出交互式命令行让你输入执行部署时需要使用的私钥,因为vm.startBroadcast
实际上是需要私钥的,不然后面的操作就没法做了
最后等待你的合约部署完成…Voila!
5. Foundry进阶使用——cast
作为一位光荣的Misc手,我一直觉得CyberChef是最好用的工具之一;而对应的,在Blockchain这方面,我觉得Foundry里的cast
能和我们伟大的赛博厨子地位相当,下面就简单写一下cast
的一些简单操作:
5.1 初识cast
让我们先从比较基础的开始,比如获取特定地址的余额:
1 | cast balance --rpc-url http://your_rpc.url 0xtarget_address |
或者根据区块高度获取指定区块的全部信息:
1 | cast block --rpc-url http://your_rpc.url block_height --full |
我们可以看到cast
的指令一般都是以cast subcommand --rpc-url http://your_rpc.url args
的格式来的,后面的指令很多也都是套这个模板往上填的,后面我就省略URL参数了,自己尝试使用的时候记得加
5.2 获取合约字节码
不是所有的题目都会给你合约源码,比如LilCTF2025的区块链题目,那么此时我们应该怎么办呢?
5.2.1 获取Runtime Bytecode
我们知道合约如果需要在链上执行操作,那么肯定得有相关的数据在链上吧,这些数据实际上就是合约的运行时字节码(Runtime Bytecode),而通过cast
获取它们的方法也很简单:
1 | cast code 0xtarget_address |
最后获取到的数据是一串Hex字符串,我们自然是看不懂的,但是网上有很多反编译器,比如Dedaub,你只需要把字节码复制进去就能得到反编译后的伪代码了,而且可以切换成多种语言格式,比如Solidity,Yul,TAC等
5.2.2 获取Constructor Bytecode
如果有了解过合约的部署过程,我们就会知道一个合约实际上是存在两部分字节码的,其中在constructor()
内的代码的字节码是即用即删的(以保证constructor()
只被调用1次),也就是我们的Constructor Bytecode,除此之外就是刚刚提到的Runtime Bytecode,那么问题来了:这即用即删的Constructor Bytecode我们应该如何获取呢?
我们都知道合约部署时那次交易会将合约的字节码作为calldata发送出去,而实际上里面就包含了Constructor Bytecode,因此我们的目标也就变成了如何获取合约创建那次交易的data
5.2.2.1 知道合约创建时的交易哈希
如果知道交易哈希那么就非常简单了:
1 | cast rpc eth_getTransactionByHash 0xtarget_txn |
这里的rpc意思是使用Ethereum JSON-RPC API,而后面的eth_getTransactionByHash
就是这个API的方法之一
其实
cast code
本质上就是cast rpc eth_getCode
,感兴趣的话可以简单了解一下Ethereum JSON-RPC API
最后这段命令返回的是完整的交易详情,里面最长的那段Hex就是我们需要的完整的字节码,一般来说这个字节码存在2个0x6080,第1个6080之后的是Constructor Bytecode,而第2个后面的就是Runtime Bytecode,所以如果完整的字节码反编译出来的没看到主合约逻辑,可以尝试去掉Constructor Bytecode再反编译一次
5.2.2.2 不知道合约创建时的交易哈希
这种情况先骂一下出题人大大的坏<(  ̄^ ̄)(θ(θ☆( >_<
其实办法还是有的,只是相对来说会麻烦一些,总体思路还是没有问题的:找到合约创建的交易,但是这次我们需要从区块层面入手
首先通过下面的命令我们能获得合约创建时区块的高度:
1 | cast block-number 0xtarget_address |
接下来使用5.1的命令获取完整的区块信息,最后在transactions
中找到input能大部分对的上的那次交易即可,交易哈希是hash那栏,input就是完整的合约字节码
我自己尝试的时候调到了Sepolia Ethereum的第3000003个区块,发现里面有个合约创建的交易,还真是CTF的题目合约
5.2.3 一点小小的Broken Hacks
刚刚我们提到可以获取Constructor Bytecode,那么同时我们可以获取constructor()
传入的参数值(如果函数有参数传入的话),它们都会被放在合约创建那次交易的calldata的最末尾,那么假如出题人在没有意识的情况下将一些重要的数据作为constructor()
的参数传入,那么…嘿嘿嘿…
还是LilCTF2025的区块链题目,这道题就存在这个问题,它传入的数据就是我们需要传入的数据,数据类型是string memory
所以看起来难看点,但是string本身没问题,也很好提取出来,所以我们完全不需要知道加密逻辑是啥,直接传就行(笑)
5.3 获取存储中指定位置内的数据
虽然Solidity有private
修饰词,但是由于区块链的公开性,我们自己仍旧可以获取到这些数据,只是没法通过合约获取而已,使用cast
的话我们可以有如下的指令:
1 | cast storage 0xtarget_address storage_slot |
其中storage_slot
就是我们的存储槽的位置,至于如何计算合约内的哪个数据被放在哪个位置可以看这篇文章:What is Smart Contract Storage Layout? (alchemy.com)
现在你已经有做出70%题目的潜力了,剩下的就是熟悉Solidity语法和常见漏洞、了解现实项目的实现、还有不断地尝试,最后你一定会成为Blockchain领域大神!
至于剩下的路,就等着你来开辟了!加油!(*≧︶≦))( ̄▽ ̄* )ゞ
Final Version by Cauliweak9 on Aug 21st, 2025
- 本文作者: 9C±Void
- 本文链接: https://cauliweak9.github.io/2024/04/28/Blockchain-Guide/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!