首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存msg.sender,但不存储

保存msg.sender,但不存储
EN

Ethereum用户
提问于 2020-11-26 13:24:43
回答 1查看 162关注 0票数 2

在这个特定的方案中,我们传递Attacker契约的地址( Victim.foo )。

通过使用委托代理,我们维护了msg.sender字段,但是我们使用的不是Storage的存储,而是Attacker的S。

Victim合同是否容易受到维护msg.sender字段的攻击(这里将是Victim的S地址)并使用Victim的存储?

代码语言:javascript
复制
contract Victim {
  uint some;
  function foo(address _contract) {
    // ....
    SomeInterface(_contract).changeStorage(10);
    //....
  }
}

contract Storage {
  uint value;
  function changeStorage(uint _value) {
    require(msg.sender == victim);
    value = _value;
  }
}

contract Attacker {

  function changeStorage(uint _value) {
     bytes memory data = 0x.. //abi-encoded changeStorage with some value
     execute(victim, data);
  }

  function execute(address _target, bytes memory _data) {
    (bool success,) = _target.delegatecall(_data);
  }
}
EN

回答 1

Ethereum用户

发布于 2020-11-26 21:22:20

这就是我从代码和问题中了解到的:如果A调用B,而B委托C,那么C执行中的状态更改是否会影响A中的存储?

答案是否定的,但不是。因为受害者正在调用攻击者,攻击者的存储变成了操作的存储,受害者是msg.sender。然后,当攻击者将调用委托到Storage时,它将受害者保留为msg.sender,并保留作为攻击者操作的存储。

这里修改受害者中的存储的唯一方法是让受害者直接委托所有存储。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/90525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档