首页
社区
课程
招聘
[原创]Ethernaut智能合约代码审计题目writeup(15-18)
发表于: 2020-5-23 19:58 26215

[原创]Ethernaut智能合约代码审计题目writeup(15-18)

2020-5-23 19:58
26215


目标:现在手里有一些代币,但是十年之后才能转走,先办法转走他们,使得你合约中的代币为 0

先看一下有多少代币

await contract.balanceOf(player)


image.png


在合约中,他 import 了一个 StandardToken.sol

引用的这个合约中有两个转账函数,一个是 transfer 还有一个是 transferFrom,而题目的合约只对 transfer 进行了重写,我们可以使用题目 import 的那一个合约中的 transferFrom,先看一下 StandardToken.sol import 的 ERC20Lib.sol,看一下 transferFrom 是怎么定义的,他需要先经过 approve 批准才能使用

使用 approve 进行授权

await contract.approve(player,toWei(1000000))


然后通过 transferFrom 来实施转账

await contract.transferFrom(player,contract.address,toWei(1000000))


image.png


image.png


image.png



目标:拿到合约所有权

delegatecall 调用的时候执行的是调用的那个函数,但是用的是本合约的变量,可以写一个 exp

首先调用正常合约中的一个函数 setxxxTime("恶意合约地址"),这样就可以把他的变量改成了我们的合约地址,再次去调用的时候就是去执行我们合约中的代码了,比如:

await contract.setSecondTime("恶意合约的地址")

这样 timeZone2Library 就成了恶意合约的地址,再次去执行 setSecondTime 的时候就是执行的恶意合约了,拿我们部署的来说就是改变了合约的所有者

await contract.setFirstTime(player)


image.png


一开始合约所有者不是我们,后面我们已经成为了合约的所有者,在第一次做的时候这样是不行的,要先用 setSecondTime 设置恶意合约为变量,然后 setFirstTime 来改变合约所有者,不明白怎么回事


image.png


image.png



目标:注册


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//