前言
- 不经意间看到的一个题目,就随便做了一下
- 大佬勿喷
- 合约地址: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即可
- 需要注意的是,需要先强制转账给题目合约,不然重入攻击没法完成
- 完结,撒花🎉🎉🎉🎉🎉🎉🎉🎉🎉

 
          