当前位置: 首页 > 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…...

利用ADS实现多频段阻抗自动优化的实战指南

1. 从零开始理解多频段阻抗匹配 刚入行那会儿&#xff0c;我对阻抗匹配的理解还停留在"把50欧姆搞对就行"的层面。直到某次调试一个同时工作在900MHz和2.4GHz的双频天线时&#xff0c;才发现单频段匹配的思路完全不够用——调好了低频段&#xff0c;高频段性能就崩了…...

基于springboot服装生产管理的设计与实现.7z(源码+论文+任务书+开题报告)

[点击下载链接》》》] 本协力服装厂服装生产管理系统设计目标是实现协力服装厂服装生产的信息化管理&#xff0c;提高管理效率&#xff0c;使得协力服装厂服装生产管理作规范化、科学化、高效化。 本文重点阐述了协力服装厂服装生产管理系统的开发过程&#xff0c;以实际运用为…...

避开这些坑!群晖+acme.sh申请Let’s Encrypt证书的完整指南

群晖NAS上零踩坑申请Lets Encrypt证书的终极实践手册 每次看到浏览器地址栏那个刺眼的"不安全"提示就浑身难受&#xff1f;作为群晖深度用户&#xff0c;我花了三个周末时间踩遍了所有证书申请的坑。从idn指令缺失到nss验证失败&#xff0c;从API调用超时到证书自动更…...

腾讯游戏卡顿终极解决方案:ACE-Guard资源限制器完整指南

腾讯游戏卡顿终极解决方案&#xff1a;ACE-Guard资源限制器完整指南 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否在玩《地下城与勇士》、《英雄…...

部署开源的Minecraft服务器智能运维管理系统 Minecraft-Rcon-Manage 自存简易教程

项目地址&#xff1a;Minecraft-Rcon-Manage 前言 笔者最近寻找一款能实现Minecraft服务器RCON远程访问的工具&#xff0c;找到了这个目前正在持续更新、功能丰富的开源项目Minecraft-Rcon-Manage&#xff0c;但实际部署过程中发现作者提供的教程博客无法正常访问&#xff0c…...

例子-子网划分问题

...

EDCNN在低剂量CT图像去噪中的边缘增强与复合损失优化策略

1. 低剂量CT图像去噪的挑战与EDCNN的突破 低剂量CT扫描在临床应用中越来越普遍&#xff0c;因为它能显著降低患者接受的辐射剂量。但随之而来的问题是图像噪声增加&#xff0c;这给医生的诊断带来了巨大挑战。传统去噪方法往往难以在噪声抑制和细节保留之间取得平衡&#xff0…...

ABC系统实战指南:逻辑综合与形式验证的数字电路设计工具

ABC系统实战指南&#xff1a;逻辑综合与形式验证的数字电路设计工具 【免费下载链接】abc ABC: System for Sequential Logic Synthesis and Formal Verification 项目地址: https://gitcode.com/gh_mirrors/ab/abc 在现代数字电路设计流程中&#xff0c;逻辑综合与形式…...

AD21实战:3种方法搞定Keepout和机械层互转,最后一种能救急

AD21实战&#xff1a;3种高效解决Keepout与机械层互转难题的方法 在PCB设计过程中&#xff0c;Keepout层和机械层的正确使用与转换是确保设计准确性的关键环节。许多工程师都遇到过这样的困境&#xff1a;当设计文件中包含复杂图形元素时&#xff0c;简单的层切换或属性批量修…...

2026年网络安全报告

2026年网络安全报告 2026年网络安全报告分析了2025年全球网络威胁形势&#xff0c;指出攻击速度和规模加快&#xff0c;人工智能、身份滥用等技术被攻击者整合&#xff0c;同时预测了2026年行业趋势并给出首席信息安全官建议。 网络安全趋势 不止电子邮件&#xff1a;多渠道…...