Fallout
Reference
目标
- 成为合约Owner
分析
Up to Solidity 0.4.21
在solidity 0.4.21之前的版本,构造函数和合约同名:
pragma solidity <=0.4.21;
contract Oldie {
uint randomvar;
function Oldie(uint _randomvar) public { // Constructor
randomvar = _randomvar;
}
}
Above to Solidity ^0.4.21
在solidity ^0.4.21
以及之后的版本,有专门初始化合约参数的构造函数 constructor()
:
constructor (uint _randomvar) public { // New Constructor
randomvar = _randomvar;
}
合约问题
Unspelled 构造函数
- 合约版本已经
^0.6.0
,应付使用constructor(){}
作为构造函数 - 合约在高版本中使用了已经弃用的构造函数,并且函数拼写错误以及没有任何权限控制
- 更新
storage
参数应该具有严格的权限管控,合约对于Owner
地址的更新没有提供任何限制,任何地址都可以call fal1out()
函数更改owner
地址。
/* constructor */
function Fal1out() public payable {
owner = msg.sender;
allocations[owner] = msg.value;
}
实现步骤
- 部署合约
- 直接调用
fal1out()
函数,更新全局Owner