前言
- 高校战“疫”网络安全分享赛区块链
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; |