目标:拿到合约里面的所有资金
这个题老版本失败!白往里面放了那么多钱!!!
用新版本的成功了
因为他是提现完成之后才修改账户余额的,可以使用重入攻击
另外常用转币方式有三种,题目中用了第三种方法
<address>.reansfer()
发送失败时会通过 throw 回滚状态,只会传递 2300 个 gas 以供调用,从而防止重入
<address>.send()
发送失败时,返回布尔值 false,只会传递 2300 个 gas 以供调用,从而防止重入
<address>.gas().call.value()()
当发送失败时,返回布尔值 false 将传递所有可用的 gas 进行调用(可通过 gas(gas _value) 进行限制),不能有效防止重入攻击
用的是这个脚本:
部署的时候给他 1 ether,然后使用 initiateAttack 就可以啦
执行后
目标:成为 top,让变量 top 变为 true
代码:
题目声明了 Building 接口中的那个 isLastFloor 函数,我们可以自己编写
只要让他反转两次就可以啦
exp:
部署 hack 合约,然后执行 exploit 函数,就可以了,可以用 flag 查看一下
也可以在控制台查看 await contract.top()
目标:解锁需要一个 key,而这个 key 是 data[2] 是 private 的
在区块链上面没有私密的东西,都是公开的,只要找到就能过关
evm 每次处理32个字节,不足 32 字节的变量相互共享并补齐 32 字节
那么我们简单分析下题目中的变量:
bool public locked = true; //1 字节 01
uint256 public constant ID = block.timestamp; //32 字节 常量 不写入存储
uint8 private flattening = 10; //1 字节 0a
uint8 private denomination = 255;//1 字节 ff
uint16 private awkwardness = uint16(now);//2 字节
bytes32[3] private data;
第一个32 字节就是由locked、flattening、denomination、awkwardness组成,另外由于常量 constant 是无需存储的,所以从第二个32 字节开始就是 data。前几个合起来是第一个 32,data[0] 是第二个 32,data[1] 是第三个 32,所以我们的是第四个
web3.eth.getStorageAt(instance,3,function(x,y){console.info(y);})
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-5-23 09:58
被kanxue编辑
,原因: