更新:https://aumasson.jp/data/talks/balccon18.pdf
一、写错构造函数
函数默认属性为public,变量默认属性为internal
构造函数拼写错误,导致合约易主,例如
合约ZiberCrowdsale,的构造函数Crowdsale(名称不一样)
合约完整code:https://etherscan.io/address/f0a924661b0263e5ce12756d07f45b8668c53380#code
二、fallback函数中易主
fallback函数(没有函数名)为合约在出现错误的情况下默认会执行的函数,如图
最简单的fallback函数调用方式:(用metamask)直接像合约地址转账
以太坊中调用函数机制:根据函数ID查找函数然后执行,若没有找到,则执行fallback函数
函数ID是用计算函数签名的keccak256值,取前4字节。函数transfer(address,uint256)的ID是 0xa9059cbb.(在线计算工具:https://emn178.github.io/online-tools/keccak_256.html)
调用函数transfer(0x41414141, 0x42),数据如下(32位/字节)
0xa9059cbb00000000000000000000000000000000000000000000000000000000414141410000000000000000000000000000000000000000000000000000000000000042
三、整数下溢,充值
无符号整数为“循环数”,最大值MAX+1=0,最小值为0,0-1=MAX,下面代码
balances[msg.sender] - _value >= 0恒成立,如果balances[msg.sender]=10,则调用contract.transfer(0x0, 11)之后,balances[msg.sender] -= _value;将balances[msg.sender]值变为2^256-1
整数上溢情况类似
四、代理调用Delegation
如图,Delegation代理调用Delegate中的函数,msg.data传入pwn()函数ID 0xdd365b8b即可使合约易主
代理调用功能强大但也危险,因为外部代码可以完全操作自身变量。较为著名的攻击:The Parity Wallet Hack
参考:
http://blog.sina.com.cn/s/blog_6cd4a7350102yc91.html
http://blog.sina.com.cn/s/blog_6cd4a7350102ybyo.html
https://ethernaut.zeppelin.solutions/
https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/
本文持续更新中