前言
- 不经意间看到的一个题目,就随便做了一下
- 大佬勿喷
- 合约地址:
0x496371aF69612e7C85F8a558f9f19E0c15E9d4B0 @ ropsten, payforflag(string memory b64email)
Analyse
- 没有给源码,自己逆向,得到下面的逻辑
1 | pragma solidity ^0.4.23; |
- 很简单,先调用
profit
,使得balance[msg.sender] = 3
,这里s2
、s3
、s4
是owner设置的,我们可以直接web3.eth.getStorageAt
查看即可,发现s2=65537
、s3=64834
、s4=41958
,然后就是中国剩余定理求解问题,可用下面脚本,求得amount=227609298
1 | #!/usr/bin/env python |
- 然后调用
withdraw
两次,重入攻击,便可满足balance[msg.sender]>=10000000000
exp
1 | pragma solidity ^0.4.23; |
- 依次调用
hack1
、hack2
、hack3
即可 - 需要注意的是,需要先强制转账给题目合约,不然重入攻击没法完成
- 完结,撒花🎉🎉🎉🎉🎉🎉🎉🎉🎉