国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一個以太坊合約的漏洞分析-重入攻擊

這篇具有很好參考價值的文章主要介紹了一個以太坊合約的漏洞分析-重入攻擊。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

請找出下列合約漏洞,并說明如何盜取ContractB 中的數(shù)字資產(chǎn),并修復合約。中說明: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 中盜取數(shù)字資產(chǎn)。攻擊者可以利用 withdrawFunds 函數(shù)中的漏洞來實現(xiàn)攻擊,讓我們一步步分析和修復這個問題。

漏洞分析:

  1. withdrawFunds 函數(shù)中,合約從 _balances[msg.sender] 減去了 burnamount,然后使用 msg.sender.call{value:amount}(""); 從合約向調(diào)用者地址發(fā)送以太幣。

  2. 這里的漏洞是沒有重入保護機制的。攻擊者可以通過多次調(diào)用 withdrawFunds 函數(shù)來進行重入攻擊,每次都可以取回以太幣并重復扣除 _balances[msg.sender]

攻擊步驟:

  1. 攻擊者在合約中調(diào)用 depositFunds 函數(shù)來存入以太幣,生成相應數(shù)量的代幣。

  2. 攻擊者多次調(diào)用 withdrawFunds 函數(shù),重入攻擊使 _balances[msg.sender] 不斷減少,而每次調(diào)用都會從合約中取回相同數(shù)量的以太幣。

  3. 因此,攻擊者可以重復取回代幣,并獲得更多的以太幣。

修復漏洞:

為了修復這個漏洞,需要在 withdrawFunds 函數(shù)中添加重入保護。以下是修復后的代碼:

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 函數(shù)內(nèi)添加了一個 checkReentrancy 布爾變量,用于保護函數(shù)免受重入攻擊。在函數(shù)調(diào)用之前,我們要求 checkReentrancytrue,并在函數(shù)開始時將其設置為 false,以防止多次進入。

注意:文章來源地址http://www.zghlxwxcb.cn/news/detail-674831.html

  • 重入攻擊是一種常見的智能合約漏洞,請務必在編寫合約時采取適當?shù)闹厝氡Wo措施。
  • 此處提供的修復只是一個示例,根據(jù)實際情況和需求可能需要進行進一步的安全性和邏輯審查。
  • 在部署和使用智能合約時,務必注意審查合約代碼,測試合約的各種情況,以確保安全性和可靠性。

到了這里,關于一個以太坊合約的漏洞分析-重入攻擊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 智能合約 -- 常規(guī)漏洞分析 + 實例

    智能合約 -- 常規(guī)漏洞分析 + 實例

    漏洞分析 攻擊者利用合約漏洞,通過 fallback()或者receive() 函數(shù)進行 函數(shù)遞歸 進行持續(xù)取錢。 剛才試了一下可以遞歸10次,貌似就結(jié)束了(version: 0.8.20)。 直接看代碼: 銀行合約:有存錢、取錢、查看賬戶余額等函數(shù)。 攻擊合約: 攻擊、以及合約接受以太幣就觸發(fā)的receive()函數(shù)

    2024年02月13日
    瀏覽(28)
  • PHP程序的常見漏洞攻擊分析

    目錄 一、前言 二、如何通過全局變量進行攻擊? 三、如何通過遠程文件進行攻擊?

    2024年02月08日
    瀏覽(15)
  • shiro漏洞復現(xiàn)及其攻擊流量分析

    shiro漏洞復現(xiàn)及其攻擊流量分析

    最近面試時經(jīng)常被問到,每次說的都不太完美,現(xiàn)在再來復現(xiàn)一邊。 Apache Shiro是一個開源安全框架,提供身份驗證、授權(quán)、密碼學和會話管理。 利用vulhub搭建的靶場。 在Apache Shiro = 1.2.4版本中存在反序列化漏洞。 該漏洞成因在于,Shiro的“記住我”功能是設置cookie中的reme

    2024年02月06日
    瀏覽(18)
  • 歡迎來到Web3.0的世界:Solidity智能合約安全漏洞分析

    歡迎來到Web3.0的世界:Solidity智能合約安全漏洞分析

    智能合約是運行在區(qū)塊鏈網(wǎng)絡中的一段程序,經(jīng)由多方機構(gòu)自動執(zhí)行預先設定的邏輯,程序執(zhí)行后,網(wǎng)絡上的最終狀態(tài)將不可改變。智能合約本質(zhì)上是傳統(tǒng)合約的數(shù)字版本,由去中心化的計算機網(wǎng)絡執(zhí)行,而不是由政府或銀行等中央集權(quán)機構(gòu)執(zhí)行。智能合約程序可以用Solidi

    2024年02月03日
    瀏覽(26)
  • OKLink2月安全月報| 2起典型漏洞攻擊案例分析

    OKLink2月安全月報| 2起典型漏洞攻擊案例分析

    在本月初我們發(fā)布的2024年2月安全月報中提到,2月全網(wǎng)累計造成損失約1.03億美元。其中釣魚詐騙事件損失占比11.76%。 OKLink提醒大家,在參與Web3項目時,應當仔細調(diào)研項目的真實性、可靠性,提升對釣魚網(wǎng)站和風險項目的甄別能力,降低投資的風險。 官方社媒遭受詐騙與釣魚

    2024年03月14日
    瀏覽(23)
  • 智能合約安全之重入攻擊淺析

    概述: ? ? 重入攻擊是由于智能合約調(diào)用了外部不安全合約,或者對外發(fā)送以太幣,使得合約的外部調(diào)用能夠被劫持,導致合約內(nèi)的方法被外部合約遞歸調(diào)用 形成重入攻擊有如下條件: ? ? 1、調(diào)用了外部不安全合約 ? ? 2、使用了不安全的轉(zhuǎn)賬方式,未進行g(shù)as限制。 ? ?

    2024年02月07日
    瀏覽(19)
  • 一個小筆記——spankchain重入攻擊

    一個小筆記——spankchain重入攻擊

    SpankChain支付通道合約(受害合約): https://etherscan.io/address/0xf91546835f756da0c10cfa0cda95b15577b84aa7#code 攻擊者地址: https://etherscan.io/address/0xcf267ea3f1ebae3c29fea0a3253f94f3122c2199 攻擊者惡意合約地址: https://etherscan.io/address/0xc5918a927c4fb83fe99e30d6f66707f4b396900e 攻擊者惡意合約發(fā)起的攻擊交易(

    2024年02月11日
    瀏覽(20)
  • 漏洞分析:MS12-020漏洞

    漏洞分析:MS12-020漏洞

    漏洞分析:MS12-020漏洞 實驗工具 1、VMware虛擬機 2、Kali 2021 系統(tǒng)虛擬機 3、Windows 7系統(tǒng)虛擬機 1、第一步:在VMware中打開Kali 2021虛擬機和Windows 7虛擬機,并確保兩臺機器能夠互相【Ping】通,網(wǎng)絡連接正常。 2、確定能連通后,打開MSF攻擊框架,Kali 2021【終端】中輸入命令【msf

    2024年02月05日
    瀏覽(24)
  • 墨者——內(nèi)部文件上傳系統(tǒng)漏洞分析溯源 內(nèi)部文件上傳系統(tǒng)漏洞分析溯源

    墨者——內(nèi)部文件上傳系統(tǒng)漏洞分析溯源 內(nèi)部文件上傳系統(tǒng)漏洞分析溯源

    1.選擇合適的文件上傳 2.可以看到為 *.asp 文件 3.可以推測出此站點為 IIS 4.上傳 shell.asp 試試 5.上傳報錯,將其改名為 shell.asp.txt 上傳,發(fā)現(xiàn)上傳成功 6.有個問題就是服務器將我們所上傳的文件進行了重命名,故我們應該想辦法截斷 7.經(jīng)過測試發(fā)現(xiàn)不行,那么查看一下操作系統(tǒng)

    2024年02月06日
    瀏覽(23)
  • BeesCMS系統(tǒng)漏洞分析

    BeesCMS系統(tǒng)漏洞分析

    墨者學院 漏洞復現(xiàn) 進入首頁,看到?jīng)]什么問題,用kail字典birb掃下路徑(發(fā)現(xiàn)管理頁面) 看到輸入框,嘗試sql注入,發(fā)現(xiàn)有注入漏洞 既然存在報錯信息,我們就嘗試報錯注入,經(jīng)過嘗試and也被過濾了,and用an and d代替,union用un union ion代替,select用selselectect代替: 爆出數(shù)據(jù)

    2024年02月15日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包