前言
- 高校战“疫”网络安全分享赛区块链
OwnerMoney题目 - 以太坊
Ropsten测试链 - 合约地址:https://ropsten.etherscan.io/address/0x40a590b70790930ceed4d148bf365eea9e8b35f4
- 题目:附件下载
Source
1 | pragma solidity ^0.4.23; |
Analyse
- 查看
payforflag,我们需要成为owner,同时buyTimes[msg.sender] >= 100 想要成为
owner,可以通过change_owner函数实现change_owner函数要求必须通过合约调用,而不是外部账户调用,同时要求合约地址最后三位是0xfff,可以参考 https://hitcxy.com/2020/generate-address/status[msg.sender]要求为true:可以通过change(address _owner)解决,Changing接口中声明了isOwner函数,用户可自行编写,要使status[msg.sender] = true,则tmp.isOwner(_owner)第一次调用需返回false,第二次调用返回true,所以就有了思路:设置一个初始值为true的变量,每次调用isOwner()时,将其取反再返回。这样便满足了我们是owner,只需再满足buyTimes[msg.sender] >= 100
发现只有
sell函数,会有buyTimes[msg.sender] -= 1的操作,其实这是重入问题,这里需要满足require(_amount >= 200),但是buy只能给100,典型的薅羊毛问题,最后再利用整数下溢即可满足buyTimes[msg.sender] >= 100
exp
1 | pragma solidity ^0.4.23; |
