当前位置: 首页 > news >正文

一个以太坊合约的漏洞分析-重入攻击

请找出下列合约漏洞,并说明如何盗取ContractB 中的数字资产,并修复合约。中说明:ContractB 的contract_a接口为ContractA 地址

pragma solidity ^0.8.21;
interface ContractA {function get_price() external view returns (uint256);
}interface ERC20 {function balanceOf(address) external view returns (uint256);function transfer(address, uint256) external returns (bool);}interface UniswapV2Pair {function transfer(address, uint) external returns (bool);function mint(address to) external returns (uint ) ;function burn(address to) external returns (uint , uint );}contract ContractB {ContractA contract_a;UniswapV2Pair _uniswapV2Pair;ERC20 token0;ERC20 token1;uint256 liquidity;address public _owner;mapping (address => uint256) private _balances;bool check=true;modifier noreentrancy(){require(check);check=false;_;check=true;}constructor(address owner){_owner=owner;}function setcontracta(address addr,address uniswapV2Pair,address _token0,address _token1) public  {require(msg.sender==_owner);contract_a = ContractA(addr);_uniswapV2Pair = UniswapV2Pair(uniswapV2Pair);token0=ERC20(_token0);token1=ERC20(_token1);}function depositFunds() public payable noreentrancy(){uint256 mintamount=msg.value*contract_a.get_price()/10e8;_balances[msg.sender]+=mintamount;}function withdrawFunds(uint256 burnamount) public payable noreentrancy(){_balances[msg.sender]-=burnamount;uint256 amount=burnamount*10e8/contract_a.get_price();msg.sender.call{value:amount}("");}function balanceof(address acount)public view returns (uint256){return _balances[acount];}}pragma solidity ^0.8.21;contract ContractA {uint256 private  _totalSupply;uint256 private _allstake;mapping (address => uint256) public _balances;bool check=true;modifier noreentrancy(){require(check);check=false;_;check=true;}constructor(){}function get_price() public view virtual returns (uint256) {if(_totalSupply==0||_allstake==0) return 10e8;return _totalSupply*10e8/_allstake;}function deposit() public payable noreentrancy(){uint256 mintamount=msg.value*get_price()/10e8;_allstake+=msg.value;_balances[msg.sender]+=mintamount;_totalSupply+=mintamount;}function withdraw(uint256 burnamount) public noreentrancy(){uint256 sendamount=burnamount*10e8/get_price();_allstake-=sendamount;payable(msg.sender).call{value:sendamount}("");_balances[msg.sender]-=burnamount;_totalSupply-=burnamount;}}

这段 Solidity 代码中存在一个关键的漏洞,允许攻击者在 ContractB 中盗取数字资产。攻击者可以利用 withdrawFunds 函数中的漏洞来实现攻击,让我们一步步分析和修复这个问题。

漏洞分析:

  1. withdrawFunds 函数中,合约从 _balances[msg.sender] 减去了 burnamount,然后使用 msg.sender.call{value:amount}(""); 从合约向调用者地址发送以太币。

  2. 这里的漏洞是没有重入保护机制的。攻击者可以通过多次调用 withdrawFunds 函数来进行重入攻击,每次都可以取回以太币并重复扣除 _balances[msg.sender]

攻击步骤:

  1. 攻击者在合约中调用 depositFunds 函数来存入以太币,生成相应数量的代币。

  2. 攻击者多次调用 withdrawFunds 函数,重入攻击使 _balances[msg.sender] 不断减少,而每次调用都会从合约中取回相同数量的以太币。

  3. 因此,攻击者可以重复取回代币,并获得更多的以太币。

修复漏洞:

为了修复这个漏洞,需要在 withdrawFunds 函数中添加重入保护。以下是修复后的代码:

bool private checkReentrancy = true;modifier noreentrancy() {require(checkReentrancy, "Reentrant call detected");checkReentrancy = false;_;checkReentrancy = true;
}function withdrawFunds(uint256 burnamount) public payable noreentrancy() {require(_balances[msg.sender] >= burnamount, "Insufficient balance");_balances[msg.sender] -= burnamount;uint256 amount = burnamount * 10e8 / contract_a.get_price();(bool success, ) = msg.sender.call{value: amount}("");require(success, "Transfer failed");
}

在修复的代码中,我们在 withdrawFunds 函数内添加了一个 checkReentrancy 布尔变量,用于保护函数免受重入攻击。在函数调用之前,我们要求 checkReentrancytrue,并在函数开始时将其设置为 false,以防止多次进入。

注意:

  • 重入攻击是一种常见的智能合约漏洞,请务必在编写合约时采取适当的重入保护措施。
  • 此处提供的修复只是一个示例,根据实际情况和需求可能需要进行进一步的安全性和逻辑审查。
  • 在部署和使用智能合约时,务必注意审查合约代码,测试合约的各种情况,以确保安全性和可靠性。

相关文章:

一个以太坊合约的漏洞分析-重入攻击

请找出下列合约漏洞,并说明如何盗取ContractB 中的数字资产,并修复合约。中说明:ContractB 的contract_a接口为ContractA 地址 pragma solidity ^0.8.21; interface ContractA {function get_price() external view returns (uint256); }int…...

测试先行:探索测试驱动开发的深层价值

引言 在软件开发的世界中,如何确保代码的质量和可维护性始终是一个核心议题。测试驱动开发(TDD)为此提供了一个答案。与传统的开发方法相比,TDD鼓励开发者从用户的角度出发,先定义期望的结果,再进行实际的开发。这种方法不仅可以确保代码满足预期的需求,还可以在整个开…...

如何用Dockerfile部署LAMP架构

目录 构建LAMP镜像(Dockerfile) 第一步 创建工作目录 第二步 编写dockerfile文件 Dockerfile文件配置内容 第三步 编写网页执行文件 第四步 编写启动脚本 第五步 赋权并且构建镜像 第六步 检查镜像 第七步 创建容器 第八步 浏览器测试 构建LA…...

基于量子粒子群算法(QPSO)优化LSTM的风电、负荷等时间序列预测算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

SQL Server软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 SQL Server是一种关系型数据库管理系统,由美国微软公司开发。它被设计用于存储、管理和查询数据,被广泛应用于企业级应用、数据仓库和电子商务等场景。 以下是SQL Server软件的主要特点和功能&#xff1…...

基于Django的博客管理系统

1、克隆仓库https://gitee.com/lylinux/DjangoBlog.git 若失效:https://gitee.com/usutdzxy/DjangoBlog.git 2、环境安装 pip install -Ur requirements.txt3、修改djangoblog/setting.py 修改数据库配置,其他的步骤就按照官方文档。 DATABASES {def…...

windows系统依赖环境一键安装

window系统程序依赖库,可以联系我获取15958139685 脚本代码如下,写到1. bat文件中,双击直接运行,等待安装完成即可 Scku.exe -AVC.exe /SILENT /COMPONENTS"icons,ext\reg\shellhere,assoc,assoc_sh" /dir%1\VC...

centos7安装nacos

解决 Nacos 国内下载速度缓慢的问题 方案 1. 选择相应的版本源码下载 1.1 依次点击 1、2、3 选中我们的最新稳定版本 1.4.0 1.2 点击下载 ZIP、或者 clone 也行,这里都可以 2. 本地编译 2.1 预备环境准备 2.2 解压编译 3. 启动验证 3.1 解压 3.2 启动服务器 3…...

【python】python智能停车场数据分析(代码+数据集)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...

如何使用Redis来防止穿透、击穿和雪崩问题

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,SDXL百科全书 「java、python面试题」…...

以getPositionList为例,查找接口函数定义及接口数据格式定义

job-app-master/pages/index/index.vue中299行 async getPositionList(type refresh, pulldown false) {this.status 请求中;if (type refresh) {this.query.page 1;} else {this.query.page;}let res await this.$apis.getPositionList(this.query);if (res) {if (type …...

一生一芯8——在github上添加ssh key

为在github上下载代码框架,这里在github上使用ssh key进行远程连接,方便代码拉取 参照博客https://blog.csdn.net/losthief/article/details/131502734 本机 系统ubuntu22.04 git 版本2.34.1 本人是第一次配置,没有遇到奇奇怪怪的错误&…...

2023年6月电子学会Python等级考试试卷(一级)答案解析

青少年软件编程(Python)等级考试试卷(一级) 一、单选题(共25题,共50分) 1. 可以对Python代码进行多行注释的是?( ) A. #...

ppt如何转pdf文档?用这个方法可将ppt转pdf

在现代社会中,PPT(幻灯片)已成为一种常见的演示工具,被广泛应用于学术、商务、培训等领域。然而,PPT文件的使用和分享存在一些问题,例如文件格式不兼容、内容修改易被篡改等。为了解决这些问题,将PPT转换为PDF格式已成…...

Hope.money:新兴DeFi项目如何重新定义稳定币生态的未来?

联储加息导致金融市场紧缩,Terra、3AC、FTX等知名中心化机构未能妥善应对而暴雷,并重创了整个加密货币市场,导致参与者损失惨重。这些事件揭示了中心化机构的局限,投资者对其资产掌控权的担忧愈发强烈。 自2018年首个DeFi协议Com…...

使用 S3 生命周期精确管理对象生命周期

在亚马逊工作这些年,我发现 S3 的生命周期配置是管理对象生命周期的重要但复杂的工具。在这篇文章中,我将利用实战经验,深入剖析生命周期,从核心概念到实际应用。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活…...

RocketMQ零拷贝原理

1 PageCache ●由内存中的物理page组成,其内容对应磁盘上的block。 ●page cache的大小是动态变化的。 ●backing store:cache缓存的存储设备。 ●一个page通常包含多个block,而block不一定是连续的。 1.1读Cache ●当内核发起一个读请求时&#x…...

HTML <tbody> 标签

实例 带有 thead、tbody 以及 tfoot 元素的 HTML 表格: <table border="1"><thead><tr><th>Month</th><th>Savings</th></tr></thead><tfoot><tr><td>Sum</td><td>$180<…...

4.22 TCP 四次挥手,可以变成三次吗?

目录 为什么 TCP 挥手需要四次呢&#xff1f; 粗暴关闭 vs 优雅关闭 close函数 shotdown函数 什么情况会出现三次挥手&#xff1f; 什么是 TCP 延迟确认机制&#xff1f; TCP 序列号和确认号是如何变化的&#xff1f; 在一些情况下&#xff0c; TCP 四次挥手是可以变成 T…...

鲁棒性简述

鲁棒性&#xff08;Robustness&#xff09;是指系统或算法对于异常情况或不良条件的抵抗能力和适应能力。一个鲁棒性强的系统能够在面对异常、噪声、错误或意外情况时&#xff0c;仍能够保持高效的运行或输出可接受的结果。 鲁棒性是在设计和开发系统时要考虑的一个重要特性&am…...

复习leetcode

​​​​​​460. LFU 缓存 31. 下一个排列 322. 零钱兑换 662. 二叉树最大宽度 43. 字符串相乘...

从聚类(Clustering)到异常检测(Anomaly Detection):常用无监督学习方法的优缺点

一、引言 无监督学习是机器学习的一种重要方法&#xff0c;与有监督学习不同&#xff0c;它使用未标记的数据进行训练和模式发现。无监督学习在数据分析中扮演着重要的角色&#xff0c;能够从数据中发现隐藏的模式、结构和关联关系&#xff0c;为问题解决和决策提供有益的信息。…...

git仓库提交流程

拉取最新代码 cd dev-ops git拉取最新master代码&#xff1a; git checkout master git pull git checkout wangdachu_dev git merge master :wq 1、切换到文件的本地目录 cd ~/Desktop/aldaba-ops 2、修改用户名和邮箱 git config --global user.email "xxxxxxxxxx.…...

层叠上下文、层叠顺序

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 什么是层叠上下文 层叠上下文&#xff08;Stacking Context&#xff09;是指在 HTML 和 CSS 中&#xff0c;用于控制和管理元素层叠顺序以及呈现的一种机制。在一个网页中&#xff0c;许多元素&#xff08;例如文…...

postgres开发目录

目录 推荐 0.00001 Bruce的博客 0.00002 官方社区博客 0.00003 德哥的培训资料 0.00004 官方开发指南 0.00005 官方网站 0.00006 官方中国网站 0.00007 官方Wiki 0.00008 postgresql代码树 0.00009 gitee-学习资料1 0.00010 gitee-源码 安装与编译 1.00001git源码clone后进…...

计算机视觉入门 6) 数据集增强(Data Augmentation)

系列文章目录 计算机视觉入门 1&#xff09;卷积分类器计算机视觉入门 2&#xff09;卷积和ReLU计算机视觉入门 3&#xff09;最大池化计算机视觉入门 4&#xff09;滑动窗口计算机视觉入门 5&#xff09;自定义卷积网络计算机视觉入门 6&#xff09; 数据集增强&#xff08;D…...

Python分享之redis(2)

Hash 操作 redis中的Hash 在内存中类似于一个name对应一个dic来存储 hset(name, key, value) #name对应的hash中设置一个键值对&#xff08;不存在&#xff0c;则创建&#xff0c;否则&#xff0c;修改&#xff09; r.hset("dic_name","a1","aa&quo…...

springboot aop方式实现敏感数据自动加解密

一、前言 在实际项目开发中&#xff0c;可能会涉及到一些敏感信息&#xff0c;那么我们就需要对这些敏感信息进行加密处理&#xff0c; 也就是脱敏&#xff0c;比如像手机号、身份证号等信息。如果我们只是在接口返回后再去做替换处理&#xff0c;则代码会显得非常冗余&#xf…...

RabbitMQ---work消息模型

1、work消息模型 工作队列或者竞争消费者模式 在第一篇教程中&#xff0c;我们编写了一个程序&#xff0c;从一个命名队列中发送并接受消息。在这里&#xff0c;我们将创建一个工作队列&#xff0c;在多个工作者之间分配耗时任务。 工作队列&#xff0c;又称任务队列。主要思…...

GitRedisNginx合集

目录 文件传下载 Git常用命令 Git工作区中文件的状态 远程仓库操作 分支操作 标签操作 idea中使用git 设置git.exe路径 操作步骤 linux配置jdk 安装tomcat 查看是否启动成功 查看tomcat进程 防火墙操作 开放指定端口并立即生效 安装mysql 修改mysql密码 安装lrzsz软…...

简洁汽车配件网站模板/百度知道网页版登录入口

什么是冒泡排序&#xff1f; 是通过挨个的比较&#xff0c;将最大&#xff08;或最小&#xff09;数字层层交换至所有数据的开头&#xff0c;每冒一次&#xff0c;数据头部往后移一位&#xff0c;经过N次冒泡之后&#xff0c;得到最终排序&#xff01;&#xff01;&#xff01…...

重庆市官方网站/惠州seo代理计费

假设您的DataFrame具有类似于以下内容的架构(即Assets和Revenue是数字)&#xff1a; df.printSchema() #root # |-- ID: long (nullable true) # |-- Assets: integer (nullable true) # |-- Revenue: integer (nullable true) 您可以在已设置的条件下将DataFrame自身设置为…...

网站建设具体流程图/整站优化seo

简书 Wwwwei转载请注明原创出处&#xff0c;谢谢&#xff01;Java枚举7种常见用法举个例子需求假设现在有三种水果:苹果、香蕉、梨;现在随机选择一样水果,打印选择的结果信息。思路对于这种多分支结构,我们习惯性的使用编号的方式,将三种水果分别编号为1,2,3;通过编号来完成和水…...

可以免费做推广的网站/百度app下载安装普通下载

XD中的图层面板Adobe XD里画出来的每一个元素都是一个独立的图层&#xff0c;和PS一样可以通过快捷键CtrlG键进行自由组合&#xff0c;也可以通过CtrlShiftG取消组合。单击工具栏中的“图层”工具&#xff0c;或者按CtrlY键打开和关闭图层面板。在未选择任何对象的情况下&#…...

谁做的怀来吧网站/市场营销师报名官网

File:MainActivity.java 将 输入框里的 IP号码保存到 SharedPreferences 指定的 config.xml文件中&#xff0c;再将数据回显出来。 package com.jiangge.ipdial;import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import an…...

wordpress 登录后查看/网站关键词优化wang

一、控制面板中安装Telnet相关组件 单击“开始”菜单&#xff0c;单击“控制面板”在控制面板中单击打开“程序和功能”项目在左侧的蓝色区域界面单击“打开或关闭 Windows 功能”弹出“Windows 功能”对话框&#xff0c;在列表中勾选“Telnet客户端”&#xff0c;单击“确定”…...