etherum智能合约什么时候变得不“智能”

更新: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/

本文持续更新中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值