-
-
[原创]Ethernaut智能合约代码审计题目writeup(15-18)
-
发表于: 2020-5-23 19:58 26215
-
目标:现在手里有一些代币,但是十年之后才能转走,先办法转走他们,使得你合约中的代币为 0
先看一下有多少代币
await contract.balanceOf(player)
在合约中,他 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))
目标:拿到合约所有权
delegatecall 调用的时候执行的是调用的那个函数,但是用的是本合约的变量,可以写一个 exp
首先调用正常合约中的一个函数 setxxxTime("恶意合约地址"),这样就可以把他的变量改成了我们的合约地址,再次去调用的时候就是去执行我们合约中的代码了,比如:
await contract.setSecondTime("恶意合约的地址")
这样 timeZone2Library 就成了恶意合约的地址,再次去执行 setSecondTime 的时候就是执行的恶意合约了,拿我们部署的来说就是改变了合约的所有者
await contract.setFirstTime(player)
一开始合约所有者不是我们,后面我们已经成为了合约的所有者,在第一次做的时候这样是不行的,要先用 setSecondTime 设置恶意合约为变量,然后 setFirstTime 来改变合约所有者,不明白怎么回事
目标:注册
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- 对某款智能手表的分析与攻击 6564
- [原创][车联网安全]使用STM32开发板实战汽车UDS诊断 15017
- [分享]binwalk路径穿越导致RCE(CVE-2022-4510) 9984
- [原创]Hack-A-Sat 2020预选赛 beckley 13588
- [原创]一个BLE智能手环的分析 31562