Ethernaut Lvl 6委派演练:如何滥用微妙的委托电话

此级别要求您声明所给实例的所有权。


委托调用是一种特殊的低级函数调用,旨在从另一个(通常是库)contract调用函数

proxycall()的优点是您可以保留当前调用合约的上下文。 此上下文包括其storage及其msg.sendermsg.value属性。

关于存储的快速说明以太坊将数据存储在存储“插槽”中,这是这32个字节大小的插槽。 每次将变量保存到存储中时,它都会自动占用当前插槽或序列中下一个插槽的剩余空间。

在下图中,合同A对合同B的saveX()函数进行了委托调用,该调用最终使合同A的存储空间发生了变化 。 让我们逐步完成:

首先,合同A通过一个委托调用来调用saveX函数。 委托 调用使用调用合同的存储(也称为Storage A 覆盖合同B的存储

接下来,执行saveX函数。 注意,合同B最初将bar存储到存储slot 0 。 因此,当此函数现在引用变量bar ,它将再次在slot 0查找。

但是, slot 0现在是指向foo的引用指针。 因此foo设置为xbar保持在范围之外并且未被触碰。

tl:dr :当合同A对合同B进行委托调用时,它允许合同B自由更改其存储A。


显然,当开发人员在安全的存储上下文中使用委托调用(或从恶意库继承)时会发生安全风险(稍后会对此进行更多介绍)。

来自 Solidity docs :如果存储变量是通过低级的委托调用访问的,则两个合约的存储布局必须对齐,以便被调用合约可以按名称正确访问调用合约的存储变量。 如果像高级库一样将存储指针作为函数参数传递,则情况并非如此。

现在,利用对delegatecall()的更深入了解来获得该级别合同的所有权!


  1. 注意, Delegation.sol对图书馆合同Delegate.sol
  2. 注意Delegate.sol有一个名为pwn()的公共函数,该函数会将owner变量的所有权更改为调用该函数的人!
 合同代表{ 
向公共所有者讲话; //占用广告位0
... function pwn()public {
所有者= msg.sender; //将msg.sender保存到插槽0
}
}

3.注意,您的委托合同的slot 0也存储了owner ,正是您要更改的变量! 此外,似乎如果您设法在Delegation.sol pwn()调用后备函数来调用pwn() ,则您将成为调用合同的所有者。

  function()public { 
if(delegate.delegatecall(msg.data)){
这个;
}
}

4.请记住,在以太坊中,您可以通过在事务中发送data来调用公共功能。 格式如下:

  contractInstance.call( bytes4sha3 (“ functionName(inputType)”)) 

5.使用Remix IDE或控制台,调用Delegation.sol的后备功能:

  //我已经在控制台中进行了计算, 
//字节4(sha3(“ pwn()”))等待sendTransaction({
来自:“ 0x1733d5adaccbe8057dba822ea74806361d181654”,
到:“ 0xe3895c413b0035512c029878d1ce4d8702d02320”,
数据:“ 0xdd365b8b0000000000000000000000000000000000000000000000000000000000000000000000000000”
});

6. await contract.owner()显示您现在是所有者!

提示 :您可以逐步浏览Remix调试器(在Javascript VM模式下),以查看存储上下文的变化! 您可以在Remix调试器的“已满storage fully loaded下拉列表中找到存储插槽。

恭喜,您现在已经重现了价值3000万美元的奇偶校验黑客背后的核心漏洞!


  • 使用更高级别的call()函数从库继承,尤其是当您i)不需要更改合同存储并且ii)不在乎气体控制时。
  • 从打算更改合同存储的库中继承时,请确保将存储插槽与库的存储插槽对齐,以避免出现这些极端情况。
  • 对调用委托调用的函数进行身份验证并进行条件检查。
  • 阅读关于安全性注意事项的Solidity文档。

Ethernaut Lvl 5令牌演练:如何滥用算术下溢和溢出

这是Zeppelin团队的智能合约安全难题的深入系列。 我会直接给您资源…

medium.com

Ethernaut Lvl 7 Force演练—如何自毁并创建以太黑洞

这是Zeppelin团队的智能合约安全难题的深入系列。 我们学习关键的Solidity概念以…

medium.com